是否可以在Autofac XML配置中注册通用列表服务?

时间:2017-04-18 05:37:35

标签: c# dependency-injection autofac

我正在尝试以编程方式和XML方式配置依赖项。我有一个IMyService类型的服务列表。我已经以编程方式将每个服务注册到容器构建器:

ContainerBuilder builder = new ContainerBuilder();
builder.Register(t => new Logger()).As<ILogger>();

builder.Register(t => new MyService1(t.Resolve<ILogger>()));
builder.Register(t => new MyService2(t.Resolve<ILogger>()));
builder.Register(t => new MyService3(t.Resolve<ILogger>()));
builder.Register(t => new MyService4(t.Resolve<ILogger>()));
builder.Register(t => new MyService5(t.Resolve<ILogger>()));

我现在想做的是通过XML注册这些服务的动态列表,这样我就可以在这些服务中只注入所需的服务(所需的服务可以根据部署环境进行更改)。

我可以这样编程:

builder.Register(t => new List<IMyService> { 
                          t.Resolve<MyService1>(), 
                          t.Resolve<MyService2>(), 
                          t.Resolve<MyService3>() })
       .Named<IList<IMyService>>("ListOfMyServices");

但是为了避免代码重新编译以及每次所需服务更改时的部署,我试图通过Autofac XML配置来实现这一点?有没有办法做到这一点?

我的引擎注册表(不需要配置XML)是:

builder.Register(t => new MyEngine(t.ResolveNamed<IList<IMyService>>("ListOfMyServices")));

2 个答案:

答案 0 :(得分:0)

Autofac XML配置非常简单, Autofac XML配置不支持此方案。

一种方法是使用命名注册并在AppSettings配置文件中指定所请求服务的列表

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Logger>().As<ILogger>();

builder.RegisterType<MyService1>().As<IMyService>().Named<IMyService>("Service1");
builder.RegisterType<MyService2>().As<IMyService>().Named<IMyService>("Service2");
builder.RegisterType<MyService3>().As<IMyService>().Named<IMyService>("Service3");
builder.RegisterType<MyService4>().As<IMyService>().Named<IMyService>("Service4");
builder.RegisterType<MyService5>().As<IMyService>().Named<IMyService>("Service5");

然后你可以像这样注册MyEngine

String[] namedServices = ConfigurationManager.AppSettings["MyServices"].Split(','); 

builder.Register(c => {
           var services = namedServices.Select(s => c.ResolveNamed<IMyService>(s));
           return new MyEngine(services.ToList());
       })
       .As<IMyEngine>();

在您的配置文件中:

<configuration>
  <appSettings>
    <add key="MyServices" value="Service1,Service2,Service5" />
  </appSettings>
</configuration>

答案 1 :(得分:0)

我无法粘贴手机中的代码。 但步骤如下: 1.在XML配置中注册所有服务。但只有您真正打算用于配置的服务。 2.为每个服务分配名称。 3.创建app.config值,您可以在其中存储所有必需的服务。 4.在开始时阅读本节并将其注入服务列表。