2017-09-01 2 views
0

Ich habe zwei Möglichkeiten, ein Programm (Konsole), als Client-Aufruf Dienste oder als Server seine eigenen lokalen Dienste aufrufen. In der ersten Weise ist die Autofac-Initialisierung sehr schnell, da nur zwei Module registriert werden, der Server so, wie es langsamer ist, da Autofac alle Servermodule initialisieren muss (mehr als 1 Minute). Die Art der Ausführung hängt von einem Parameter der Konsole ab.Wie dynamisch laden Autofac-Konfiguration zu initialisieren

Warten auf eine bessere Lösung Ich habe es auf dem Konsolenmodul implementiert, Laden der Servermodule, wenn es notwendig ist, aber es ist ein bisschen hardcodiert (Module und Konfigurationen/Eigenschaften aus Dateien extrahieren), weil ich sie beim Mischen konfiguriert habe Dateien und Module (Beispiele unten) und ich würde die Konfiguration auf Dateien behalten.

Ich möchte dynamisch die Datei auszuwählen:

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

oder

<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> 

Wie Sie sehen können, gibt es eine Menge Konfiguration auf Code builder.RegisterModule zu replizieren.

Antwort

0

Endlich habe ich die Methode builder.RegisterModule verwendet, um die Module zu registrieren:

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

Wo executeLocal ist ein Flag zum Laden durch Daten des Threads gesendet:

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