2017-09-01 290 views
0

我有执行一个程序(控制台),作为客户端调用服务或服务器调用自身的本地服务的方法有两种。第一种方式Autofac初始化非常快,只导致注册两个模块,服务器的速度较慢,因为Autofac必须初始化所有服务器模块(超过1分钟)。执行方式取决于控制台的参数。如何动态地加载Autofac配置初始化

等待更好的解决方案我在控制台模块上实现了它,在需要时加载服务器模块,但它有点硬编码(从文件中提取模块和配置/属性),因为我配置了混合文件和模块(下面的示例),我会保留配置文件。

我想动态选择文件:

<autofac configSource="autofac-client.config" /> 

<autofac configSource="autofac-server.config" /> 

CODE:

autofac-client.config:

<autofac defaultAssembly="Console1"> 
    <files> 
     <file name=".\BaseSettings\ClientServices.config" section="clientServices" /> 
    </files> 
    <modules> 
     <module type="Console1.AutofacModules.ComponentModule, Console1" /> 
    </modules> 
</autofac> 

autofac-server.config:

<autofac defaultAssembly="Console1"> 
    <files> 
     <file name=".\BaseSettings\ClientServices.config" section="clientServices" /> 
     <file name=".\BaseSettings\AutofacRegistrationModules.config" section="AutofacRegistrationModules" /> 
    </files> 
    <modules> 
     <module type="assembly1.AutofacModules.ComponentModule, assembly1" /> 
     <module type="assembly2.AutofacModules.PrintManagerModule, assembly2" /> 
     <module type="assembly3.AutofacModules.ComponentModule, assembly3" /> 
     <module type="assembly4.AutofacModules.FormEngineServicesComponentModule, assembly4" /> 
     <module type="assembly5.ReportManagerServicesComponentModule, assembly5" /> 
     <module type="assembly6.NHibernateComponentModule, assembly6"> 
      <properties> 
       <property name="DatabaseConfigurationSectionName" value="databaseSettingsEClient" /> 
      </properties> 
     </module> 
     <module type="assembly7.AutofacModules.ComponentModule, assembly7" /> 
     <module type="assembly8.AutofacModules.ComponentModule, assembly8" /> 
     <module type="assembly9.AutofacModules.ComponentModule, assembly9" /> 
     <module type="Console1.AutofacModules.ComponentModule, Console1" /> 
    </modules> 
</autofac> 

正如你可以看到,有很多的配置使用builder.RegisterModule的代码复制。

回答

0

最后我已经采用的方法builder.RegisterModule注册模块:

protected override void Load(ContainerBuilder builder) 
    { 
     ... 
     bool executeLocal = false; 
     var executeLocalObj = Thread.GetData(Thread.GetNamedDataSlot("ExecuteLocal")); 
     if (executeLocalObj != null) 
     { 
      executeLocal = (bool)executeLocalObj; 
     } 
     if (executeLocal) 
     { 
      builder.RegisterModule(new mpm.seg.Common.Database.AutofacModules.NHibernateComponentModule()); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly1.ComponentModule, assembly1")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly2.AutofacModules.ComponentModule, assembly1")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly3.AutofacModules.ComponentModule, assembly3")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly4.AutofacModules.ComponentModule, assembly4")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly5.AutofacModules.ComponentModule, assembly5")) as IModule); 
      builder.RegisterModule(new assembly6.AutofacModules.NHibernateComponentModule() { DatabaseConfigurationSectionName = "databaseSettings" }); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly7.AutofacModules.ComponentModule, assembly7")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly8.AutofacModules.ComponentModule, assembly8")) as IModule); 
      builder.RegisterModule(Activator.CreateInstance(Type.GetType("assembly9.AutofacModules.ComponentModule, assembly9")) as IModule); 
     } 
    } 

哪里executeLocal是发送通过Thread的要加载的数据的标志:

Thread.SetData(Thread.GetNamedDataSlot("ExecuteLocal"), executeLocal);