2017-05-17 2 views
0

Ich möchte zwei verschiedene Injection-Fabriken für den gleichen Typ registrieren, zum Beispiel könnte es die beiden Registrierungen unten sein.Einheit wählen Sie eine andere Injektion Fabrik

 container.RegisterType<BaseSearchProvider>(
       new HierarchicalLifetimeManager(),  
       new InjectionFactory(c =>ExamineManager.Instance.SearchProviderCollection["Setting 1"])); 


     container.RegisterType<BaseSearchProvider>(
      new HierarchicalLifetimeManager(), 
      new InjectionFactory(c => ExamineManager.Instance.SearchProviderCollection["Setting 2"])); 

Für jetzt, foreach Typ ich manuell meine Konstruktionen registrieren. Ich habe verschiedene Dienste, aber einige Dienste müssen die erste Registrierung und andere die zweite Registrierung verwenden? Gibt es eine Möglichkeit dies durchzuführen, indem Sie ein "Profil" wie dieses verwenden?

 container.RegisterType<IMeetingSearchService>("using Setting 1") 

Das einzige, was ich jetzt denke ab als die Lösung ist, die BaseSearchProvider zu erben und diese Art zu registrieren, so dass ich zwei verschiedene Typen registrieren können und passen alle meine Konstrukteure mit diesem, so dass ich auch don‘ Ich brauche diesen Selektor. Aber vielleicht gibt es einen anderen Weg?

Antwort

0

Es gibt eine Möglichkeit, nach Namen aufzulösen.

Sie benötigen also zwei verschiedene abgeleitete Typen von BaseSearchProvider. sie Lets nennen:

SettingsOneSearchProvider & SettingsTwoSearchProvider

Jetzt können wir die richtigen Einstellungen erhalten, indem Sie die mit 'ExamineManager.Instance.SearchProviderCollection [ "settingsname"]' Code im Konstruktor der zwei neue Anbieter.

In Ihrem Registrierungs Klasse hinzufügen Sie Namen zu den Anmeldungen wie folgt aus:

container.RegisterType<BaseSearchProvider, SettingsOneSearchProvider>("SettingsOne" 
     new HierarchicalLifetimeManager(),  
     new InjectionFactory(c =>ExamineManager.Instance.SearchProviderCollection["Setting 1"])); 


container.RegisterType<BaseSearchProvider, SettingsTwoSearchProvider>("SettingsOne" 
     new HierarchicalLifetimeManager(), 
     new InjectionFactory(c => ExamineManager.Instance.SearchProviderCollection["Setting 2"])); 

Jetzt brauchen wir eine zusätzliche Entschlossenheit Methode in der Registrierungs Klasse von Namen aufzulösen:

public static T Resolve<T>(string name) 
{ 
    return container.Resolve<T>(name); 
} 

Jetzt können Sie Lösen Sie einen der beiden mit diesem Code:

+0

Danke ... Ich werde das ein bisschen später testen ... Aber Wenn ich zwei Klassen ableiten muss, dann ist es nutzlos, wenn ich es gut verstehe, da ich diese beiden Klassen einfach bei meiner Injektionsfabrik registrieren kann? –

+0

Das Einführen einer Fabrik in eine Registrierung verstößt gegen meine Sicht der Umkehrung der Kontrolle. Diese Factory muss in der Klasse aufgelöst werden, in der Sie sie verwenden möchten. Deshalb brauchen wir konkrete Klassen, um der Fabrik mitzuteilen, welche spezifischen Einstellungen wir benötigen. – PolkaHard

Verwandte Themen