2010-05-13 4 views
36

Sto usando StructureMap per il mio DI. Immaginate Ho una classe che richiede 1 argomento come:Passare gli argomenti del costruttore quando si usa StructureMap

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

ho bisogno di specificare il "ConnectionString in fase di esecuzione quando ricevo un'istanza di IProductProvider

Ho configurato StructureMap come segue.:

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

Tuttavia, non voglio chiamare equalTo ("qualcosa ...") metodo qui come ho bisogno di qualche struttura per specificare questo valore in modo dinamico in fase di esecuzione.

La mia domanda è: come posso ottenere un'istanza di IProductProvider usando ObjectFactory?

Attualmente, ho qualcosa di simile:

ObjectFactory.GetInstance<IProductProvider>(); 

Ma, come sapete, questo non funziona ...

Qualsiasi consiglio sarebbe molto apprezzato.

risposta

32

Ho trovato la risposta da solo! Ecco la soluzione:

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

Spero che questo aiuti altri che hanno incontrato lo stesso problema.

+1

Assicurarsi che someValueAtRuntime sia un valore semplice, non un qualsiasi tipo di Func o Lambda (se è possibile farlo) per recuperarlo, altrimenti tale funzione verrà eseguita ogni volta che la dipendenza viene risolta. Ho usato questo trucco per iniettare una stringa di connessione, proprio come stai facendo. Finché si ottiene la stringa in una variabile locale prima di impostare ObjectFactory, si dovrebbe andare bene. – Mel

+5

Yo. Cosa succede se ho diversi argomenti, arg1, 2, 3 ecc. E voglio passare in ogni argomento così com'è, ma mantenere uno degli argomenti come null. Come fare questo? –

+0

@Mosh grazie per la risposta, come mai, per favore, dimmi come stai passando qualcheValueAtRuneTime? un esempio di questo per favore. – wandos

51

Suggerisco di dichiararlo con la configurazione di StructureMap. Utilizzando il codice StructureMap un po 'più recente:

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

In questo modo non fa appesantire il vostro codice client da dover conoscere il valore e può mantenere la configurazione IoC separata dal codice principale.

+1

Suppongo che questo sia il posto in cui si configura StructureMap. Come si passa il 'someValueAtRunTime' lì? – user1713059