C# 在MVCAPI项目中如何编写构造函数

C# 在MVCAPI项目中如何编写构造函数,c#,asp.net-mvc,api,code-first,C#,Asp.net Mvc,Api,Code First,我正试图用代码优先的方法编写一个API项目。我写了一些代码,但它显示错误 尝试创建“CatalogController”类型的控制器时出错。确保控制器具有无参数公共构造函数 及 类型Nop.Api.Controllers.CatalogController没有默认构造函数 控制器 public class CatalogController : ApiController { private readonly ICatalogModelFactory _catalogModelFacto

我正试图用代码优先的方法编写一个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;
     }
}
谁能帮我解决这个错误吗?我不明白构造器部分出了什么问题。调试时,它没有到达断点


为什么会出现此错误?

当您从控制器请求资源时,框架需要处理该请求。因此,路由识别控制器、操作等,然后需要实例化控制器的实例以调用所需的方法

为了做到这一点,他要么需要一个公共空构造函数,要么需要某种方法来解决构造函数的依赖关系

在您的例子中,您有一个具有ICatalogModelFactory依赖项的ctor。当应用程序启动(Global.asax)时,框架需要您实现并注册新的解析器,如下所示:

DependencyResolver.SetResolver(new MyDependencyResolver());
下面是UnityContainer自定义依赖项解析程序的示例,如下所示:


顺便说一句,另一种方法是创建一个DI容器并简单地用DI容器解析控制器。我更喜欢使用依赖项解析器来解析控制器。

您是否将设置为使用DI容器?是否使用依赖项注入框架?如果是的话,您可以包括如何设置它的详细信息,以及如何注册依赖项解析程序。如果没有,那么这就是你的问题,搜索一下如何在ASP.NET中使用Ninject、SimpleInjector或Autofac等框架。不,这是nopcommerce项目,我只需要添加一个api项目,但它显示了错误。请帮助我解决此问题您使用哪一版本的asp.net?4.1但为什么该版本未列出?我需要设置我的DependencyResolver的地方,我不熟悉此依赖项和API,因此我对编写此项不太了解您的应用程序中有DI容器吗?没有DI有许多层,这里我唯一的问题是如何解决构造函数问题??那么您应该如何解决ICatalogModelFactory输入参数?您无法实例化接口,因此需要某种具体的类;在global.aspx中,正如您所说,但它在MyDependencyResolver中出错??
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>();
        }
    }
}
IUnityContainer container = GetUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));