2015-09-10 69 views
0

我建立Autofac容器如下Autofac配置 - 如何转换代码段Autofac配置

_container = ConfigureContainer(new ContainerBuilder()).Build(); 

我ConfigureContainer方法建立/配置Autofac ContainerBuilder如下

 private static ContainerBuilder ConfigureContainer(ContainerBuilder cb) 
     { 
      cb.RegisterModule(new QuartzAutofacFactoryModule()); 
      cb.RegisterModule(new QuartzAutofacJobsModule(Assembly.GetExecutingAssembly())); 

      cb.Register(l => Logging.Logger.Instance()).As<ILogger>(); 

      var reader = new ConfigurationSettingsReader(); 
      cb.RegisterModule(reader); 

      // How do I convert following lines to Autofac Config? 

      cb.RegisterCollection<StandardTask>("IList<StandardTask>").As<IList<StandardTask>>(); 

      cb.RegisterType<HealthMonitoringMessageDispatcherTask>().Named<StandardTask>("HealthMonitoringTask1").MemberOf("IList<StandardTask>"); 
      cb.RegisterType<HealthMonitoringMessageDispatcherTask>().Named<StandardTask>("HealthMonitoringTask2").MemberOf("IList<StandardTask>"); 

      cb.RegisterType<PurgeMessageDispatcherTask>().Named<StandardTask>("PurgeTask1"); 
      cb.RegisterType<PurgeMessageDispatcherTask>().Named<StandardTask>("PurgeTask2"); 

      return cb; 
     } 

我有Autofac配置部分如下

<autofac> 
    <components> 
     <!--<component type="NAB.Custom.Logging.Logger, NAB.Custom.Logging" service="NAB.Logging.Core.ILogger, NAB.Logging" />--> 
     <component type="NAB.Windows.ServicesConsole.Services.SchedulerService, NAB.Windows.ServicesConsole" service="NAB.Windows.ServicesConsole.Services.Core.ITopshelfService, NAB.Windows.ServicesConsole" /> 
     <component type="NAB.Windows.ServicesConsole.Jobs.HealthMonitoringMessageDispatcherJob, NAB.Windows.ServicesConsole" /> 
     <component type="NAB.Windows.ServicesConsole.Jobs.PurgeMessageDispatcherJob, NAB.Windows.ServicesConsole" /> 
    </components> 
    </autofac> 

它解决了配置的com Ponent(波纳恩特)从自定义配置节正确,但是,我想移动从下面的代码自定义配置节登记为好,在那里我无法找到...

  // How do I convert following lines to Autofac Config? 

      cb.RegisterCollection<StandardTask>("IList<StandardTask>").As<IList<StandardTask>>(); 

      cb.RegisterType<HealthMonitoringMessageDispatcherTask>().Named<StandardTask>("HealthMonitoringTask1").MemberOf("IList<StandardTask>"); 
      cb.RegisterType<HealthMonitoringMessageDispatcherTask>().Named<StandardTask>("HealthMonitoringTask2").MemberOf("IList<StandardTask>"); 

      cb.RegisterType<PurgeMessageDispatcherTask>().Named<StandardTask>("PurgeTask1"); 
      cb.RegisterType<PurgeMessageDispatcherTask>().Named<StandardTask>("PurgeTask2"); 

任何建议妥善的解决办法?小代码片段将非常有用。基本上我注册名为集合,然后将组件注入集合,这是我的注册对象之一的构造参数。

+0

* Autofac *你使用的版本是? 'RegisterCollection'自从版本2开始被弃用.' IEnumerable '总是可以解析的,并且将包含服务'T'的所有注册组件。以下文档可帮助您了解如何使用autofac收集http://docs.autofac.org/en/latest/resolve/relationships.html#enumeration-ienumerable-b-ilist-b-icollection-b –

回答

1

Documentation on how configuration works in Autofac is here.除非您使用4.0测试版,否则您可能正在查看3.x XML configuration style

您计算出组件注册。要向注册添加一个密钥/名称,只需添加该属性即可。

<component type="Service" 
      service="IService" 
      name="the-key-goes-here" /> 

对命名集合没有XML配置支持。如果你使用它们并且不能移动到IEnumerable<T>,那么最好将它们留在模块中并通过配置注册模块。

<modules> 
    <module type="MyModule" /> 
</modules>