2016-03-23 27 views
1

ASP.NET MVC5, depo deseni, UoW ve Autofac ile bir tasarım described here olarak uygulandım.ASP.NET MVC5 denetleyicisi ve Autofac

Her şey tek bir hizmet ile denetleyicileri için çalışır ama üç hizmetlerini gerektiren bir denetleyicisi var: Artık

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

, bu gibi hizmetleri kayıt:

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

Çalışma zamanında, ben Bu hatayı alın:

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

Eğer Autofac kapta tüm hizmetlerini kayıtlı mı? – dotnetom

+0

Yayını güncellerim, evet, tüm hizmeti kayıt ediyorum. ayrı ayrı çalışmaları –

cevap

0

Kaç tane kurucu sizin parametrelerinizi değiştirdiği önemli değil denetleyici vardır. Autofac, service1'u çözemeyeceğini bildirirse, IService1'un kayıtlı olmadığı anlamına gelir.

Hatalı sorgulama veya montajdan dolayı montaj türlerinin kaydedilmesiyle ilgili bir sorun olabilir. Bunu doğrulamak için, RegisterAssemblyTypes'u yorumlamayı deneyin ve her üç hizmet için de RegisterType<Service1>().As<IService1>().InstancePerRequest() kullanın ve yardımcı olup olmadığına bakın. Ayrıca, modülünüzün Load gerçekten aranırsa kontrol edin.

kayıt hizmetleri açıkça çalıştı, geri RegisterAssemblyTypes alma deneyin ama adıyla yükleme yerine, hizmet türünden servis montaj kullanabilirsiniz:

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