ASP.NET MVC5控制器和Autofac

时间:2016-03-23 17:44:07

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

我将设计实现为described here,包含ASP.NET MVC5,存储库模式,UoW和Autofac。

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

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构造函数

1 个答案:

答案 0 :(得分:0)

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

由于查询或汇编错误,可能存在注册程序集类型的问题。要验证这一点,请尝试为RegisterAssemblyTypes发表评论,并对所有三项服务使用RegisterType<Service1>().As<IService1>().InstancePerRequest(),看看是否有帮助。还要检查您的模块Load是否实际被调用。

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

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