2010-05-13 11 views
36

Ich verwende StructureMap für meine DI. Stellen Sie sich vor ich eine Klasse, die ein Argument wie:Übergabe von Konstruktorargumenten bei Verwendung von StructureMap

public class ProductProvider : IProductProvider 
{ 
    public ProductProvider(string connectionString) 
    { 
     .... 
    } 
} 

Ich brauche die „connection zur Laufzeit angeben, wenn ich eine Instanz von IProductProvider bekommen

I StructureMap so konfiguriert haben, wie folgt.:

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>(). 
WithCtorArgument("connectionString"); 

aber ich will nicht EqualTo nennen („etwas ...“) Methode, die hier als ich eine Anlage muß dynamisch diesen Wert zur Laufzeit angeben.

Meine Frage ist: Wie bekomme ich eine Instanz von IProductProvider mit ObjectFactory?

Derzeit habe ich so etwas wie:

ObjectFactory.GetInstance<IProductProvider>(); 

Aber wie Sie wissen, das nicht funktioniert ...

Jede Beratung wäre sehr dankbar.

Antwort

32

Ich habe die Antwort selbst gefunden! Hier ist die Lösung:

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>(); 

Hoffe das hilft anderen, die das gleiche Problem aufgetreten sind.

+1

Stellen Sie sicher, dass someValueAtRuntime ein einfacher Wert ist, nicht irgendeine Art von Func oder Lambda (wenn Sie das können), um sie abzurufen, andernfalls wird diese Funktion jedes Mal ausgeführt, wenn die Abhängigkeit aufgelöst wird. Ich habe diesen Trick verwendet, um eine Verbindungszeichenfolge zu injizieren, genau wie Sie es tun. Solange Sie die Zeichenfolge in eine lokale Variable vor dem Einrichten von ObjectFactory erhalten, sollten Sie in Ordnung sein. – Mel

+5

Yo. Was ist, wenn ich mehrere Argumente habe, arg1, 2, 3 usw. Und ich möchte jedes Argument so übergeben, wie es ist, aber einen der Argumente als null behalten. Wie macht man das? –

+0

@Mosh danke für die Antwort, wie auch immer können Sie mir bitte sagen, wie Sie someValueAtRuneTime übergeben? Ein Beispiel dafür bitte. – wandos

51

Ich empfehle, dies mit der StructureMap-Konfiguration zu deklarieren. Mit Hilfe der etwas neuere StructureMap Code:

For<IProductProvider>().Use<ProductProvider> 
    .Ctor<string>("connectionString").Is(someValueAtRunTime); 

Auf diese Weise können Sie Ihre Kundennummer nicht belasten tun aus mit dem Wert kennen und Ihre IoC Konfiguration getrennt von Ihrem Hauptcode halten können.

+1

Ich vermute, das ist der Ort, an dem Sie StructureMap konfigurieren. Wie gibst du die 'someValueAtRunTime' dort hin? – user1713059

Verwandte Themen