2010-11-18 14 views
2

Ich habe eine Schnittstelle mit 3 verschiedenen Implementierungen. Ich registriere die 3 Implementierungen als benannte Aliase in der Web.config der Webanwendung mit Unity Container.UnityContainer: Bedingte Logik beim Auflösen

Gibt es eine Möglichkeit, Unity zu verwenden, um eine der registrierten Instanzen basierend auf einer Logik aufzulösen. Die Logik umfasst das Kontaktieren einer Datenbank, um zu entscheiden, welche Implementierung aufgelöst werden soll.

Schätzen Sie Ihre Hilfe.

Grüße Bilal

Antwort

2

Sie die Logik in einer abstrakten Fabrik implementieren können und injizieren es:

public interface IMyInterface { } 

public interface IMyInterfaceFactory { 
    IMyInterface GetMyInterface(); 
} 

public class MyInterfaceFactory : IMyInterfaceFactory { 
     private readonly IUnityContainer _container; 
     public MyInterfaceFactory(IUnityContainer container) { 
      _container = container; } 

     IMyInterface GetMyInterface() { 
      var impName = Get_implementation_name_from_db(); 
      return container.Resolve<IMyInterface>(impName); 
     } 
} 
+0

Vielen Dank für Ihre Antworten. Ich bevorzuge den zweiten Ansatz, da es mehr SOC ist. – Bill

+0

+1. Gute Antwort! – Steven

+0

Hi Onof, Frage bitte oben. Falls eine der Methoden in "IMyInterface" eine Eingabe benötigt. In meiner Anwendung habe ich einen ICacheManager, der bei Unity registriert ist. Ist es besser, die Parameter einzeln an die Methode zu übergeben oder die Methode den ICacheManager zum Abrufen von Daten verwenden zu lassen? Unit Testing oder Trennung von Bedenken Sicht, die empfohlen wird? Danke – Bill

1

Sie können einen ‚Router‘ Implementierung erstellen, die weiß, wie die Anforderungen an eine Route zu einem der andere Implementierungen:

// Here is a possible implementation of the router. There are 
// of course many ways to do this. 
public class MyRouterImpl : IMyInterface 
{ 
    List<IMyInterface> implementations = new List<IMyInterface>(); 

    public MyRouterImpl(MyImpl1 i1, MyImpl2 i2, MyImpl3 i3) 
    { 
     this.implementations.Add(i1); 
     this.implementations.Add(i2); 
     this.implementations.Add(i3); 
    } 

    void IMyInterface.Method() 
    { 
     int indexOfImplementationToExecute = 
      GetIndexOfImplementationToExecute(); 

     IMyInterface impl = 
      this.implementations[indexOfImplementationToExecute]; 

     impl.Method(); 
    } 
} 
Verwandte Themen