2017-02-17 4 views
0

habe zwei FragenAutofac. RegisterType nach .build und registrieren/beheben Liste

  1. Wie richtig builder.RegisterType (..) nach ApplicationContainer = builder.Build()

builder.Update (ApplicationContainer) Veraltet ist

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    ... 
    builder.RegisterType<DB>(); 
    ApplicationContainer = builder.Build(); 
} 

public void Configure() 
{ 
    //Get list of types assigned from IPlugin 
    List<Type> types = PluginLoader.LoadPlugins(); <--- will need DB registered early 
    foreach (var item in plugins) 
    { 
     builder.RegisterType(item); 
    } 
    builder.Update(ApplicationContainer); <-- .Update() is Obsolete 
} 
  1. Wie bekommen alle IPlugin
public Manage(DB _db, IEnumerable<IPlugin> plugins) 
{ 
} 
  1. Resolve nach Typ in jedem Ort
public void Manage(Type type) 
{ 
    var IPlugin plugin = (IPlugin) GlobalResolve.Resolve(type); 
} 
+1

Aktualisieren Sie Ihre bestehende Konfiguration, nachdem es gebaut wurde, ist eine schlechte Idee, deshalb ist diese Methode veraltet. Sie sollten das Laden Ihrer Plugins in die ConfigureServices-Methode verschieben. – Steven

+0

@Steven Ich brauche DB (und andere registrierte) in PluginLoaderbuilder.RegisterType (); –

+1

Erstellen Sie 'PluginLoader' manuell in' ConfigureServices'. – Steven

Antwort

1

Ich glaube nicht, Sie IoC für die Plugin benötigen.

Wenn Sie jedoch darauf bestehen, würde ich die Verantwortlichkeiten in zwei separate Container trennen. Ein Container, der alle benötigten Bits enthält, um Plugin-Typen zu finden, und einen weiteren Container, der von Ihrer Anwendung für die "normalen" Aufgaben verwendet wird. Während des Startvorgangs verwenden Sie den Initialisierungscontainer, um den anderen Container zu erstellen.

Sie können auch den Container benutzen, in dem sich der Pluginloader befindet und damit einen anderen Container erstellen.

 using (var applicationScopeContainer = _initializationContainer.BeginLifetimeScope(
      builder => 
      { 
       //register your new stuff here, resolve dependencies via _initializationContainer 
      })) 
     { 
      //resolve all depenencies via applicationScopeContainer 
     }