【问题标题】:ASP.NET MVC5 controller and AutofacASP.NET MVC5 控制器和 Autofac
【发布时间】:2016-03-25 19:09:57
【问题描述】:

我使用 ASP.NET MVC5、存储库模式、UoW 和 Autofac 实现了一个设计为 described here

一切都适用于具有单一服务的控制器,但我有一个需要三个服务的控制器:

public MyController(IService1 service1, IService2 service2, IService3 service3)
{
    _service1= service1;
    _service2= service2;
    _service3= service3;
}

现在,我像这样注册服务:

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterAssemblyTypes(Assembly.Load("namespace.service"))
              .Where(t => t.Name.EndsWith("Service"))
              .AsImplementedInterfaces()
              .InstancePerLifetimeScope();
}

在运行时,我收到此错误:

没有找到任何构造函数 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 类型 'namespace.Controllers.MyController' 可以用 可用服务和参数:无法解析参数 'Void .ctor ...的'.service.Service1 service1构造函数...

【问题讨论】:

  • 您是否在 Autofac 容器中注册了所有服务?
  • 我更新帖子,是的,我注册了所有服务。单独他们的工作

标签: c# asp.net-mvc asp.net-mvc-5 autofac


【解决方案1】:

控制器有多少构造函数参数并不重要。如果 Autofac 报告无法解析service1,则表示IService1 未注册。

由于错误的查询或程序集,注册程序集类型可能会出现问题。要验证这一点,请尝试注释掉 RegisterAssemblyTypes 并将 RegisterType<Service1>().As<IService1>().InstancePerRequest() 用于所有三个服务,看看是否有帮助。还要检查你的模块Load 是否真的被调用了。

如果注册服务显式有效,您可以尝试返回 RegisterAssemblyTypes,但使用服务类型中的服务程序集,而不是按名称加载:

    builder.RegisterAssemblyTypes(typeof (Service1).Assembly)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces()
        .InstancePerRequest();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多