繁体   English   中英

使用Autofac注册以Service结尾的所有内容

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM