2017-10-21 171 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