2017-10-21 15 views
1

코드 접근법에서 API 프로젝트를 작성하려고합니다. 일부 코드를 작성했지만 오류가 표시됩니다.mvc api 프로젝트에서 생성자를 작성하는 방법

'CatalogController'유형의 컨트롤러를 작성하는 중 오류가 발생했습니다. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오.

유형 Nop.Api.Controllers.CatalogController

public class CatalogController : ApiController 
{ 
    private readonly ICatalogModelFactory _catalogModelFactory; 

    public CatalogController(ICatalogModelFactory catalogModelFactory) 
    { 
     _catalogModelFactory = catalogModelFactory;   
    } 

    public HttpResponseMessage HomepageCategories() 
    { 
     HttpResponseMessage response = new HttpResponseMessage(); 
     var model = _catalogModelFactory.PrepareHomepageCategoryModels(); 

     var result = JsonConvert.SerializeObject(model); 
     response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(result) }; 

     return response; 
    } 
} 

사람이 오류를 해결하는 방법을 좀 도와 주시겠습니까 기본 생성자

컨트롤러를하지 않는 이유는 무엇입니까? 나는 생성자 부분에서 무엇이 잘못되었는지 알지 못한다. 이것을 디버깅 할 때 중단 점에 도달하지 않습니다.

왜이 오류가 발생합니까?

+2

DI 컨테이너를 사용하려면 [dependency resolver] (https://msdn.microsoft.com/en-us/library/system.web.mvc.dependencyresolver (v = versus118) .aspx)를 설정하고 있습니까 ? – john

+0

의존성 주입 프레임 워크를 사용하고 있습니까? 그렇다면 어떻게 설정했는지, 그리고 의존성 분석자를 어떻게 등록했는지에 대한 세부 사항을 포함 할 수 있습니까? 그렇지 않다면, 이것이 문제입니다. ASP.NET 용 Ninject, SimpleInjector 또는 Autofac과 같은 프레임 워크를 사용하는 방법을 검색하십시오. –

+0

아니요, 이것은 nopcommerce 프로젝트입니다. API 프로젝트를 추가해야하지만 오류가 표시됩니다. 이 문제를 해결할 수 있도록 도와주세요. – user355

답변

1

컨트롤러에서 리소스를 요청할 때 프레임 워크에서 요청을 처리해야합니다. 따라서 라우팅은 컨트롤러, 액션 등을 식별하고 원하는 메소드를 호출하기 위해 컨트롤러의 인스턴스를 인스턴스화해야합니다.

이렇게하려면 공개 비어있는 생성자 또는 생성자의 종속성을 해결하는 방법이 필요합니다.

귀하의 경우에는 종속성이 ICatalogModelFactory입니다. 이 link에서 발견으로 UnityContainer 사용자 종속성 해결의

DependencyResolver.SetResolver(new MyDependencyResolver()); 

여기 예 : 프레임 워크는 Dependency Resolver를 구현하고 당신에게 새로운이 같은 응용 프로그램이 시작 (Global.asax에이) 해결을 등록 할 필요가

IUnityContainer container = GetUnityContainer(); 
DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

B :

public class UnityDependencyResolver : IDependencyResolver 
{   
    IUnityContainer container;  
    public UnityDependencyResolver(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return container.Resolve(serviceType); 
     } 
     catch 
     {    
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return container.ResolveAll(serviceType); 
     } 
     catch 
     {     
      return new List<object>(); 
     } 
    } 
} 

하고 등록은 Global.asax에 위해 Application_Start있어서 발생한 그런데 또 다른 방법은 ControllerFactory을 만들고 DI 컨테이너로 컨트롤러를 해결하는 것입니다. 나는 의존성 해결자를 사용하여 컨트롤러를 해결하는 것을 선호한다.

+0

어디서 MyDependencyResolver를 설정해야합니까?이 종속성 및 API가 새로 도입되었습니다.이 점에 대해 많은 지식이 없습니다. – user355

+0

응용 프로그램에 DI 컨테이너가 있습니까? –

+0

DI가 많은 레이어가 있습니다. 여기서 유일한 문제는 어떻게 생성자 문제를 해결할 수 있습니까? – user355