2016-08-09 23 views
2

Ich versuche dynamische DI zu verwenden. Ich habe meine Konfiguration:Dynamic Dependency Injection Web API

container.RegisterType<IUserAdditionalData, UserAdditionalDataRepository>(
    new HierarchicalLifetimeManager()); 
container.RegisterType<IPermission, PermissionRepository>(
    new HierarchicalLifetimeManager());   

config.DependencyResolver = new UnityResolver.UnityResolver(container); 

An diesem Punkt ist alles Ok. Aber ich muss meine Klasse dynamisch setzen. Ich habe zwei Klassen, PermissionRepository und PermissionRepositoryTwo, die von IPermission implementieren, also möchte ich zwischen PermissionRepository und PermissionRepositoryTwo wechseln. Ich habe gelesen, dass ich Strategie-Muster verwenden kann, hat jemand eine Idee, wie das lösen kann?

+2

Wie Sie zwischen den beiden Implementierungen wechseln wollen? Basierend auf einem Konfigurationswechsel in der web.config? Basierend auf einigen Laufzeitdaten wie eine Benutzeranfrage? – Steven

+0

Danke für Ihre Antwort. Ich werde eine Einstellung in Anfrage verwenden. Ich dachte, ich könnte in WebApiConfig-Datei konfigurieren, aber diese Datei wird nur einmal aufgerufen. –

Antwort

3

Das allgemeine Muster dafür ist das Proxy-Muster. Mit diesem Muster können Sie die Entscheidung, welche Implementierung bis zur Laufzeit verwendet werden soll, verzögern und die Entscheidung innerhalb des Proxys ausblenden, während Sie weiterhin das vollständige Objektdiagramm im Vordergrund erstellen können.

Beispiel:

public sealed class RequestPermissionSelectorProxy : IPermission 
{ 
    private readonly PermissionRepository one; 
    private readonly PermissionRepositoryTwo two; 

    public RequestPermissionSelectorProxy(
     PermissionRepository one, PermissionRepositoryTwo two) { 
     this.one = one; 
     this.two = two; 
    } 

    // Here select the permission based on some runtime condition. Example: 
    private IPermission Permission => 
     HttpContext.Current.Items["two"] == true ? two : one; 

    public object PermissionMethod(object arguments) { 
     return this.Permission.PermissionMethod(arguments); 
    } 
} 

Hier ist, wie registrieren:

container.RegisterType<IPermission, RequestPermissionSelectorProxy>(
    new HierarchicalLifetimeManager()); 
+0

Vielen Dank! Deine Antwort hilf mir! –