0

막연한 제목을 위해 죄송합니다. 나는 내가 일하려고하는 것을 설명 할 것이다.IService 생성자가 생성되지 않음

내 관리자보기는 관리자보기 저장소를 사용하며 관리자 목록은 관리 저장소의 모음 인 관리 서비스를 호출합니다. 간략하게하기 위해 관리 서비스에서 참조하는 저장소는 하나뿐입니다.

내 관리보기 모델 내 클래스의 상단을 구성하는 모양이 getMenuItems 및 getMenuCats 다음 뷰 모델에 설정되어있는 데이터를 검색하는 서비스를 사용하는 두 가지 방법이 있습니다

public class adminMenuVM 
{ 
    private readonly IAdminMenuService menuService; 

    public adminMenuVM(IAdminMenuService adminMenuService) 
    { 
     this.menuService = adminMenuService; 
    } 

    public adminMenuVM() 
    { 
     menuItems = getMenuItems(); 
     menuCats = getMenuCats(); 
    } 
} 

.

내 문제는 응용 프로그램을 실행할 때 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."오류가 발생한다는 것입니다. 이제 adminMenuVM()이 viwModel에 의해 호출되고 서비스를 초기화하는 생성자가 호출되지 않기 때문입니다.

제 질문은 서비스 생성자가 호출되었는지 확인하고 뷰 모델을 호출 할 때 그 일을 어떻게 할 수 있습니까?

나는 이것을 사용하려고 시도했다 : 매개 변수없는 생성자에서 이것을 시도했지만 인터페이스의 새 인스턴스를 만들 수 없으므로 인터페이스를 할당 할 수 없다.

편집 @ 18:49 나는 생각을했지만 구현 방법을 모른다. 누군가가 어떻게 "Constructor Chain"을 할 수 있는지 또는 가능하다면 조언 할 수 있습니까? 내 생각은 매개 변수없는 생성자를 서비스 생성자에 연결하여 호출되도록합니다. 나는 벗어날 수 있지만 예전 도움에 감사 할 것입니다.

답변

0

이 점을 알아 내기 위해 관리했습니다. 가장 깨끗한 해결책은 아니지만 다른 방법으로는 볼 수 없습니다. 이 문제를 해결할 다른 사람을 돕기 위해이 문제를 고집 할 것입니다.

문제는 ViewModel에 서비스 인터페이스의 현재 인스턴스를 전달하는 것으로 요약됩니다. 인스턴스가 설정된다는 것을 알 수있는 유일한 곳은 컨트롤러의 생성자입니다. 그래서 간단히 인터페이스 서비스 유형의 공용 전역 변수를 선언하고 그 인스턴스를 저장했습니다. 현재 인스턴스가 끝나고 내 viewmodel의 생성자로 전달되어 viewmodel 생성자 요구 사항을 충족시킬 수 있습니다. 명확히하기 위해 컨트롤러와 뷰 모델의 예제를 포함했습니다.

컨트롤러 :

public class AdminController : Controller 
{ 
    private readonly IAdminMenuService lmService; 
    public IAdminMenuService testService; 

    public AdminController(IAdminMenuService layoutMarkupService) 
    { 
     this.lmService = layoutMarkupService; 
     testService = lmService; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public PartialViewResult menuPartial() 
    { 
     return PartialView("_AdminMenuPartial", new adminMenuVM(testService)); 
    } 

의 ViewModel : 빠른 응답을위한

public class adminMenuVM 
{ 
    private readonly IAdminMenuService menuService; 

    public adminMenuVM(IAdminMenuService AdminMenuService) 
    { 
     this.menuService = AdminMenuService; 
     menuItems = getMenuItems(); 
     menuCats = getMenuCats(); 
    } 
} 
0

기본 생성자를 제거하고 해당 내용을 매개 변수와 함께 생성자에 넣습니다.

+0

감사합니다.이미 시도했지만 여전히 같은 오류가 발생했습니다. 이것은 내가 설정할 수없는 IAdminMenuService 타입의 변수를 필요로하는 생성자 때문이라고 가정합니다. –

+0

adminMenuVM의 인스턴스가 여러분이나 mvc 프레임 워크에 의해 생성 되었습니까? 또한, 같은 오류를 *해서는 안되기 때문에, 어떻게 시도했는지 보여주십시오. –

+0

내 VM에 대해 강력한 형식의 뷰를 만들면 해당 MVC Framework에 의해 생성됩니다. 이것은 내 VM 맨 위에 있습니다. @ Model GenericCMS.ViewModels.adminMenuVM –

1

첫 번째 생성자는 일부 종속성 주입 컨테이너에서 사용해야하는 것처럼 보입니다.

하나의 생성자 만 사용하여 인스턴스를 만들 수 있습니다. DI가 제공된 "IAdminMenuService"로 인스턴스를 만들면 두 번째 생성자를 사용하여 새 인스턴스를 만들 수 있지만 새 인스턴스이므로 "menuService"는 비어 있습니다 (null).

DI 컨테이너에서 adminMenuVM의 tan 인스턴스를 얻는 방법을 알아야합니다 (사용하는 경우).

+0

예 DI를 사용하고 있습니다. 내 ViewModel 수준에서 문제가 발생했습니다. gloabal.asax 파일의 IAdminMenuService에 대해 adminMenuVM을 등록 할 수 있습니까? .RegisterType (새 HttpContextLifetimeManager ) –

+0

스크래치, global.asax에서 일합니다. 생각을 좀 나누어 주셨습니다. –

관련 문제