Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 错误:确保控制器具有无参数公共构造函数webapi_Asp.net Mvc_Parameters_Controller_Unity Container_Asp.net Web Api2 - Fatal编程技术网

Asp.net mvc 错误:确保控制器具有无参数公共构造函数webapi

Asp.net mvc 错误:确保控制器具有无参数公共构造函数webapi,asp.net-mvc,parameters,controller,unity-container,asp.net-web-api2,Asp.net Mvc,Parameters,Controller,Unity Container,Asp.net Web Api2,我正在使用webapi、unity和mvc。我得到的错误是“确保控制器有一个无参数的公共构造函数”。我见过类似的问题,但仍然无法使其发挥作用。我已经安装了unity.webapi,似乎有所有必要的参考资料: Microsoft.Practices.Unity-运行时:v4.0.30319,版本:3.5.0.0 Microsoft.Practices.Unity.Mvc-运行时:v4.0.30319,版本:3.5.0.0 Unity.WebApi-运行时:v4.0.30319,版本:5.1.0.

我正在使用webapi、unity和mvc。我得到的错误是“确保控制器有一个无参数的公共构造函数”。我见过类似的问题,但仍然无法使其发挥作用。我已经安装了unity.webapi,似乎有所有必要的参考资料:

  • Microsoft.Practices.Unity-运行时:v4.0.30319,版本:3.5.0.0
  • Microsoft.Practices.Unity.Mvc-运行时:v4.0.30319,版本:3.5.0.0
  • Unity.WebApi-运行时:v4.0.30319,版本:5.1.0.0
  • System.Web.Http-运行时:v4.0.30319,版本:5.2.2.0
  • System.Web.Mvc-运行时:v4.0.30319,版本:5.2.2.0
我验证了所有内容都与此网站上的内容相匹配:

以下是我所拥有的:

引导程序:

public static class Bootstrapper
{
    public static IUnityContainer Initialise()
    {
        var container = BuildUnityContainer();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();

        container.RegisterType<IDatabaseFactoryHouseDB, DatabaseFactoryHouseDB>(new HierarchicalLifetimeManager());
        container.RegisterType<UnitOfWorkHouseDB>();

        // repositories
        container.RegisterType<IEmployeeRepository, EmployeeRepository>();

        // services
        container.RegisterType<IEmployeeService, EmployeeService>();
        RegisterTypes(container);

        return container;
    }
    public static void RegisterTypes(IUnityContainer container) { }
}
WebApiConfig:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // use json strings as the default return value for the app
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

        // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
        // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
        // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
        //config.EnableQuerySupport();

        // To disable tracing in your application, please comment out or remove the following line of code
        // For more information, refer to: http://www.asp.net/web-api
        config.EnableSystemDiagnosticsTracing();
    }
不知道我错过了什么

编辑:我注意到我的App\u Start文件夹中有一个UnityConfig类。在查看了Sarathy的评论后,我意识到它不应该被称为。我在global.asax中注释掉了我的引导程序初始化,并添加了UnityConfig.RegisterComponents()行,因此现在我的global.asax如下所示:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        UnityConfig.RegisterComponents();  //  <--- added
        AreaRegistration.RegisterAllAreas();

        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Database.SetInitializer<HouseDBContext>(null);

        //Bootstrapper.Initialise(); <-- not using bootstrapper anymore
        //required for setting routes in the attributes of a controller method
        GlobalConfiguration.Configuration.EnsureInitialized();
    }
}
public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();    
        container.RegisterType<IDatabaseFactoryHouseDB, DatabaseFactoryHouseDB>(new HierarchicalLifetimeManager());
        //container.RegisterType<IUnitOfWork>();
        container.RegisterType<UnitOfWorkHouseDB>();

        // repositories
        container.RegisterType<IEmployeeRepository, EmployeeRepository>();

        // services
        container.RegisterType<IEmployeeService, EmployeeService>();

        GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
    }
}
我在使用unityconfig方法时仍然会遇到错误。使用bootstrapper,我没有得到错误,但我的服务没有初始化

我完全糊涂了。不知怎的,我觉得我混合了MVC和WebApi,事情没有正确解决

编辑2:

我查看了无参数构造函数错误的内部异常,注意到它提到了我的IUnitOfWork类:

依赖项解析失败,请键入= \“AngularMVC.Controllers.EmployeeApiController\”,名称= \“(无)\”\r\n在解析时发生异常。\r\n异常 是:InvalidOperationException-当前类型, AngularMVC.Models.Interfaces.IUnitOfWork是一个接口,不能 要构造。是否缺少类型 映射?\r\n--------------------------------------------\r\n在 发生异常时,容器为:\r\n\r\n AngularMVC.Controllers.EmployeeApiController,(无)\r\n 构造函数的参数“employeeService” AngularMVC.Controllers.EmployeeApiController(AngularMVC.Services.IEEmployeeService employeeService)\r\n正在解析 AngularMVC.Services.EmployeeService,(无)(映射自 AngularMVC.Services.IEEmployeeService,(无))\r\n 构造函数的参数“unitOfWork” AngularMVC.Services.EmployeeService(AngularMVC.Models.Repositories.IEEmployeeRepository employeeRepository,AngularMVC.Models.Interfaces.IUnitOfWork unitOfWork)\r\n正在解析 AngularMVC.Models.Interfaces.IUnitOfWork,(无)\r\n“

这只是:

public interface IUnitOfWork
{
    void Commit();
}
当我在UnityConfig中执行以下操作时:

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}
        container.RegisterType<IUnitOfWork>();
        IUnitOfWork sm = container.Resolve<IUnitOfWork>();
container.RegisterType();
IUnitOfWork sm=container.Resolve();

我收到了相同的错误,指出“当前类型AngularMVC.Models.Interfaces.IUnitOfWork是一个接口,无法构造。是否缺少类型映射?”

从代码中,我可以看出您正在使用Unity作为IoC容器。IoC容器将处理控制器类的初始化

要使IoC容器创建控制器的实例,控制器类需要具有无参数公共构造函数(也称为默认构造函数)

更新1:2015年2月18日 从您的代码中,我还没有看到IUnitOfWork接口的实现。工作单元是在领域中心建模中广泛使用的模式。通常,工作单元模式与存储库模式一起使用。工作单元的目的是使多个存储库可以在同一数据库上下文上工作

从你的代码,你注册

//container.RegisterType<IUnitOfWork>();
container.RegisterType<UnitOfWorkHouseDB>();
i工作实施:

public class UnitOfWork : IUnitOfWork
{
    //DBContext could your own db context, or a interface, like IDatabaseFactoryHouseDB 
    private DBContext _ctx;

    public UnitOfWork(DbContext ctx)
    {
        _ctx = ctx;
    }

    private IEmployeeRepository _EmployeeRepository;
    public IEmployeeRepository EmployeeRepository
    {
        get { return _EmployeeRepository ?? (_EmployeeRepository = new EmployeeRepository(_ctx)); }
    }

    private ICustomerRepository _CustomerRepository;
    public ICustomerRepository CustomerRepository
    {
        get { return _CustomerRepository ?? (_CustomerRepository = new CustomerRepository(_ctx)); }
    }

    public void Commit()
    {
        _ctx.SaveChange();
    }
}

您是否在任何地方使用UnityConfig.RegisterComponents()?您是否应该使用GlobalConfiguration.Configuration.DependencyResolver中的容器集注册依赖项,并从WebApiConfig.Register()使用它?我的App_Start文件夹中有一个名为UnityConfig的类没有被调用。我在其中注册了服务,在global.asax中注释掉了bootstrapper初始化,并添加了UnityConfig.RegisterComponents(),但仍然得到了无参数构造函数错误。我觉得我把Unity与MVC控制器和webapi的使用弄错了,因为所有这些在MVC中都能很好地工作;萨拉西——多亏了你和杰夫,我才意识到我的错误。首先,我没有在我的工作单元中实现IUnitOfWork。DOH!你完全正确!我发现我的UnitOfWork类没有实现IUnitOfWork。难怪它让我感到不适。我不知道我怎么会错过。再次感谢!
        container.RegisterType<IUnitOfWork>();
        IUnitOfWork sm = container.Resolve<IUnitOfWork>();
public class EmployeeApiController : ApiController
{
    private readonly IEmployeeService employeeService;

    public EmployeeAPIController() : base()
    {
    }

    public EmployeeApiController(IEmployeeService employeeService)
    {
        this.employeeService = employeeService;
    }
}
//container.RegisterType<IUnitOfWork>();
container.RegisterType<UnitOfWorkHouseDB>();
container.RegisterType<IUnitOfWork, UnitOfWorkHouseDB>();
// repositories
container.RegisterType<IEmployeeRepository, EmployeeRepository>();
public interface IUnitOfWork
{
    void Commit();
}
public class UnitOfWork : IUnitOfWork
{
    //DBContext could your own db context, or a interface, like IDatabaseFactoryHouseDB 
    private DBContext _ctx;

    public UnitOfWork(DbContext ctx)
    {
        _ctx = ctx;
    }

    private IEmployeeRepository _EmployeeRepository;
    public IEmployeeRepository EmployeeRepository
    {
        get { return _EmployeeRepository ?? (_EmployeeRepository = new EmployeeRepository(_ctx)); }
    }

    private ICustomerRepository _CustomerRepository;
    public ICustomerRepository CustomerRepository
    {
        get { return _CustomerRepository ?? (_CustomerRepository = new CustomerRepository(_ctx)); }
    }

    public void Commit()
    {
        _ctx.SaveChange();
    }
}