我将设计实现为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构造函数
答案 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();