2016-03-23 12 views
1

Ich implementierte ein Design als described here, mit ASP.NET MVC5, Repository-Muster, UoW und Autofac.ASP.NET MVC5 Controller und Autofac

Alles für Controller mit einem einzigen Dienst funktioniert, aber ich habe einen Controller, der drei Dienste erfordert:

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

Jetzt registrieren ich die Dienste wie folgt aus:

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

Zur Laufzeit I Erhalten Sie diesen Fehler:

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'namespace.Controllers.MyController' can be Invoked with the available services and parameters: Can not resolve parameter '.service.Service1 service1 constructor of 'Void .ctor ...

+1

Haben Sie in Autofac Container alle Dienste registriert? – dotnetom

+0

Ich aktualisiere den Beitrag, ja, ich registriere den ganzen Dienst. individuell ihre Arbeit –

Antwort

0

Es spielt keine Rolle, wie viele Konstruktorparameter Sie haben Controller hat. Wenn Autofac meldet, dass service1 nicht aufgelöst werden kann, bedeutet dies, dass IService1 nicht registriert ist.

Möglicherweise liegt ein Problem mit der Registrierung von Assembliertypen aufgrund einer falschen Abfrage oder Assembly vor. Um dies zu überprüfen, versuchen Sie, die RegisterAssemblyTypes zu kommentieren und RegisterType<Service1>().As<IService1>().InstancePerRequest() für alle drei Dienste zu verwenden, und sehen Sie, ob es hilft. Überprüfen Sie auch, ob Ihr Modul Load tatsächlich aufgerufen wird.

Bei Anmeldung Dienste explizit gearbeitet haben, können Sie versuchen, zurück zu RegisterAssemblyTypes bekommen, aber der Service Assembly aus dem Diensttyp verwenden, anstatt sie mit Namen Laden:

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