2017-10-21 170 views
1

我想在代碼第一種方法中編寫一個API項目。我寫了一些代碼,但顯示錯誤如何在mvc api項目中編寫構造函數

嘗試創建類型爲'CatalogController'的控制器時發生錯誤。確保控制器有一個無參數的公共構造函數。

類型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

您是否將[依賴解析器](https://msdn.microsoft.com/en-us/library/system.web.mvc.dependencyresolver(v = vs.118).aspx)設置爲使用您的DI容器? – john

+0

你在使用依賴注入框架嗎?如果是這樣,你可以包括你如何設置它的細節,以及你如何註冊依賴解析器。如果沒有,那麼這就是你的問題,要搜索如何使用像Ninject,SimpleInjector或Autofac for ASP.NET這樣的框架。 –

+0

不,這是nopcommerce項目,我只需要添加一個api項目,但它顯示錯誤。請幫我解決這個問題 – user355

回答

1

當您從控制器請求資源時,框架需要處理請求。因此,路由標識了控制器,操作等,然後它需要實例化控制器的實例以調用想要的方法。

爲了做到這一點,他將需要一個公共的空構造函數或某種方式來解決你的構造函數的依賴關係。

在你的情況,你有一個ctor依賴於ICatalogModelFactory。該框架將需要你實現一個Dependency Resolver和您註冊時,應用程序啓動(Global.asax中)這樣的新解析:

DependencyResolver.SetResolver(new MyDependencyResolver()); 

這裏是和例如UnityContainer自定義依賴解析器的如本link發現:

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方法中:

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

乙另一種方式是創建一個ControllerFactory,並簡單地使用DI容器解析控制器。我更喜歡使用依賴解析器來解析控制器。

+0

我需要設置MyDependencyResolver,我對這個依賴和API很陌生,所以我沒有太多的知識來寫這個 – user355

+0

你的應用程序中是否有DI容器? –

+0

沒有DI有很多層,這裏我唯一的問題是我如何修復構造函數問題? – user355