2017-01-19 8 views
1

Ich habe asp.net MVC-Anwendung geschichtet. In der Service-Schicht habe ich einen Container, um Abhängigkeiten zu registrieren. z:Unity - Resolving Abhängigkeiten basierend auf einer Bedingung

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
    } 

auf der Gestaltung Basierend, brauchen wir eine Mock Umsetzung der Klassen haben, wenn der Benutzer die Anwendung zu Testzwecken zu eröffnen.

So kam ich mit einer Idee wie

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
     container.RegisterType<ISomething, SomethingMock>(); 
    } 

Wenn ich irgendwo ein Flag, um anzuzeigen, verwenden, ob oder nicht System im Testmodus läuft, wie kann ich eine Entscheidung treffen, auf dem an die lösen Abhängigkeits Laufzeit? Wenn es keine elegante Lösung ist, was könnte die Alternative sein?

Antwort

1

Während ich Stevens Antwort und seine Überlegungen voll unterstütze, gibt es technisch eine Möglichkeit, zu tun, was Sie vorhatten. können Sie benannte Registrierung verwenden:

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ISomething, Something>(); 
    container.RegisterType<ISomething, SomethingMock>("SomethingMock"); 
} 

und dann einen String-Parameter verwenden, um es zu lösen:

string s= ""; 
var mySomething = container.Resolve<ISomething>(s); // will return standard implementation 
s = "SomethingMock" 
var mySomething = container.Resolve<ISomething>(s); // will return mock implementation 

müssten Sie abfangen, wenn asp will ISomething lösen.

als Referenz siehe https://msdn.microsoft.com/en-us/library/ff660923%28v=pandp.20%29.aspx

Jetzt ist es an Ihnen, welchen Weg Sie gehen.

+0

ich verwende Einheit 3.5 und es scheint nicht zu dem Namen zu funktionieren Auflösen Registrierungen. –

+0

Ich habe dies mit Unity 4.0.1 überprüft und es funktioniert gut, aber ich denke, es sollte auch mit älteren Versionen funktionieren. Was passiert in deinem Code? Vielleicht können wir herausfinden, was falsch ist. – jps

3

Wenn ich irgendwo ein Flag verwende, um anzuzeigen, ob das System im Testmodus läuft oder nicht, wie kann ich eine Entscheidung treffen, welche Abhängigkeit zur Laufzeit aufgelöst werden soll?

Sie sollten die Struktur Ihres Objektdiagramms nicht basierend auf Laufzeitentscheidungen ändern. Dies steht in engem Zusammenhang mit der anti-pattern of injecting runtime data into components.

Falls erforderlich, dass Sie Implementierungen wechseln basierend auf Laufzeitbedingungen (Bedeutung: Der Wert von Anfrage zu Anfrage ändern könnte), die Lösung ist eine Proxy-Klasse zu erstellen, die ISomething und wickelt das beide ISomething Implementierungen implementiert (this article zeigt einige Beispiele von Proxy-Implementierungen). Wenn ISomething.Method aufgerufen wird, kann es den Aufruf an die richtige Implementierung basierend auf der Laufzeitbedingung weiterleiten, die es an diesem Punkt bestimmt.

In Ihrem Fall sprechen Sie jedoch höchstwahrscheinlich nicht von Laufzeitbedingungen, sondern von einem Konfigurationswert. Konfigurationswerte ändern sich während der Lebensdauer der Anwendung nicht. Erst nach einem Neustart (oder einer erneuten Bereitstellung) sehen Sie normalerweise eine Wertänderung.

Das bedeutet, dass Sie einfach den Konfigurationswert beim Start eingelesen und an diesem Punkt entscheiden, welche Implementierung registriert werden soll:

if (bool.Parse(ConfigurationManager.AppSettings["Production"])) 
{ 
    container.RegisterType<ISomething, Something>(); 
} 
else 
{ 
    container.RegisterType<ISomething, SomethingMock>(); 
} 
+0

Danke für die Antwort. Mein Fall ist der Erste.Bei jeder Anfrage muss ich entscheiden, ob es sich um eine Scheinanfrage oder um eine echte Anfrage handelt. Über die Proxy-Klasse, bitte erläutern Sie mehr. Meine Serviceebene löst Geschäftsabhängigkeiten auf, und jedes Unternehmen benötigt einige Repository-Klassen, in die Datenebenen injiziert werden sollen. Jetzt muss ich nur Datenschichten vortäuschen. –

+1

@AhmadMousavi: Bitte aktualisieren Sie Ihre Frage mit zusätzlichen Informationen oder stellen Sie eine neue Frage zu SO mit den erforderlichen Details, um diese zusätzliche Frage zu beantworten. In [diesem Artikel] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100) erfahren Sie mehr darüber, wie Sie einen solchen Proxy implementieren können. – Steven

Verwandte Themen