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

问题描述:

我试图通过编程方式和通过XML来配置依赖项。我有一个IMyService类型的服务列表。我已经注册了每个服务容器制造商编程:是否可以在Autofac XML配置中注册通用列表服务?

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"))); 

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"); 

然后你就可以像这样

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>(); 

并且在登记MyEngine您配置文件:

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

是的,它可以通过这种方式完成,我想到了它。但我真的想知道它是否可以通过Autofac XML配置完成。标记为答案,因为你指出它不能完成。 –

我无法通过从手机上的代码。 但步骤如下: 1.在XML配置中注册所有服务。但只有你真的想用你的配置服务。 2.为每个服务分配名称。 3.在存储所有必需服务的位置创建app.config值。 4.阅读本节开始并将其注入到服务列表中。