Die beste Methode, um StructureMap zur Implementierung eines Strategie-Patterns zu verwenden

8

Meine Webanwendung weist je nach Art des angemeldeten Benutzers einige geringfügige Unterschiede in der Geschäftslogik und der Darstellungslogik auf. Es scheint, als ob Variationen durch das Einfügen verschiedener konkreter Klassen auf der Grundlage des Benutzertyps für DI geeignet sind. Ich frage mich also, welche Funktionen von StructureMap ich verwenden sollte, um dies zu erreichen (oder wenn ich auf der Basis von DI weit von der Basis entfernt bin).

(Ich habe gerade erfahren, dass Profile nicht der richtige Weg sind, um dies zu erreichen, da das Festlegen des Profils keine pro-Thread-Operation ist: Sind StructureMap-Profile threadsicher? )

BEARBEITEN

Ist das der richtige Weg?

%Vor%     
JeremyWeir 30.09.2009, 17:03
quelle

2 Antworten

11

Ein gängiger Weg, um dies zu implementieren, ist wie von Mark beschrieben. Sie haben eine Klasse, die ein Array aller konkreten Instanzen aufnimmt ( muss ein Array sein, damit StructureMap sich wie erwartet verhält) und dann anhand einer Logik herausfinden, welche Instanz verwendet werden soll.

>

Ein Beispielcode, den Sie in ein Konsolenprogramm oder einen Komponententest einfügen können:

%Vor%

hängt von den folgenden Typen ab:

%Vor%     
Joshua Flanagan 01.10.2009, 01:52
quelle
8

Ich würde sagen, dass dies nicht der Hauptzweck von DI ist - das heißt, Abhängigkeiten zu verbinden und zu injizieren, was auch immer sie sein mögen. Bei der Verdrahtung von Komponenten sollte keine Anwendungslogik beteiligt sein - sie sollte streng auf der Konfiguration basieren; entweder durch Code oder .config Datei. Diese Konfiguration ist anwendungsweit, daher ist es ziemlich schwierig, eine Konfiguration zu definieren, die je nach Benutzer variiert.

Das heißt, was Sie fragen, geht gut mit DI Hand in Hand - es ist nur ein bisschen senkrecht zu DI in sich selbst.

Für Ihren speziellen Zweck würde ich eine neue Abhängigkeit in Form einer Schnittstelle oder einer abstrakten Basisklasse definieren. Dies wäre eine Strategie, die basierend auf dem aktuellen Benutzer die richtigen Betontypen auswählt (die, die Sie variieren möchten).

Sie können DI verwenden, um alle verfügbaren konkreten Typen in diese Strategie einzufügen, die dann über eine Methode oder Eigenschaft verfügen, die basierend auf dem aktuellen Benutzer die richtige Auswahl unter den injizierten Services zurückgibt / p>

An allen Stellen, an denen Sie von den verschiedenen Diensten abhängig waren, entfernen Sie diese alten Abhängigkeiten und ersetzen sie durch eine Abhängigkeit von der Strategie.

    
Mark Seemann 30.09.2009 18:09
quelle