[英]Using Autofac registering everything that ends with Service
所以我在MVC中使用autofac,所以我的控制器可以在那里注入構造函數,我有我的Global.asax我有以下代碼片段,它的工作原理。
// Register your MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<PurchaseOrderSearchService>().As<IPurchaseOrderSearchService>().WithParameter("context", new PurchaseOrderManagerContext());
// Set the dependency resolver to be Autofac.
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
問題是我不想一遍又一遍地為我的所有服務做builder.RegisterType。 那我該怎么做?
我想我想要的是那種東西
builder.RegisterAssemblyTypes(foo)
.Where(t => t.Name.EndsWith("Services"))
.WithParameter("context", new PurchaseOrderManagerContext());
但不知道foo應該是什么。 或者如果RegisterAssemblyTypes是正確的方式。 我知道按慣例編碼是解決方案,但不確定約定是什么。 我的所有服務都將以字服務結束並具有界面
所以FooService將具有接口IFooService,而BarService將具有接口IBarService
還應該指出所有服務都存在於名為PurchaseOrderManager.Service的類庫中
你走在正確的軌道上。 “Foo”應該是包含要注冊的類型的程序集 - 如果您使用的是單個程序集,則以下內容應該有效:
builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly)
.Where(t => t.Name.EndsWith("Services"))
.WithParameter("context", new PurchaseOrderManagerContext())
.AsImplementedInterfaces();
將.AsImplementedInterfaces()
注冊為IFooService
需要.AsImplementedInterfaces()
- 沒有它,它們只會被注冊為FooService
等。
如果您的類位於單獨的程序集中,我通常建議您在該程序集中定義一個autofac模塊:
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// "ThisAssembly" means "any types in the same assembly as the module"
builder.RegisterAssemblyTypes(ThisAssembly)
.Where(....
}
}
然后在您的Web應用程序中注冊:
builder.RegisterModule<PurchaseOrderManager.Service.ServiceModule>();
或者,使用我的原始建議,但明確指定包含服務的程序集:
builder.RegisterAssemblyTypes(typeof(PurchaseOrderManager.Service.FooService).Assembly)
.Where(t => t.Name.EndsWith("Services"))
.WithParameter("context", new PurchaseOrderManagerContext())
.AsImplementedInterfaces();
您只需要選擇該程序集中存在的任何類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.