2010-05-13 8 views
36

J'utilise StructureMap pour mon DI. Imaginez que j'ai une classe qui prend 1 argument comme:Passage d'arguments constructeur lors de l'utilisation de StructureMap

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

je dois spécifier le « connectionString lors de l'exécution quand je reçois une instance de IProductProvider

J'ai configuré StructureMap comme suit.:

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

Cependant, je ne veux pas appeler la méthode EqualTo (« quelque chose ... ») ici comme je l'ai besoin d'installation pour indiquer dynamiquement cette valeur lors de l'exécution.

Ma question est: comment puis-je obtenir une instance de IProductProvider en utilisant ObjectFactory?

Actuellement, j'ai quelque chose comme:

ObjectFactory.GetInstance<IProductProvider>(); 

Mais comme vous le savez, cela ne fonctionne pas ...

Tout conseil serait grandement apprécié.

Répondre

32

J'ai trouvé moi-même la réponse! Voici la solution:

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

Espérons que cela aidera d'autres personnes qui ont rencontré le même problème.

+1

Assurez-vous que someValueAtRuntime est une valeur simple, pas n'importe quel type de Func ou Lambda (si vous pouvez le faire) pour le récupérer, sinon cette fonction s'exécutera chaque fois que la dépendance est résolue. J'ai utilisé cette astuce pour injecter une chaîne de connexion, tout comme vous le faites. Tant que vous placez la chaîne dans une variable locale avant de configurer ObjectFactory, cela devrait fonctionner. – Mel

+5

Yo. Que faire si j'ai plusieurs arguments, arg1, 2, 3 etc. Et je veux passer dans chaque argument tel quel mais garder l'un des arguments comme nul. Comment faire ça? –

+0

@Mosh merci pour la réponse, comment pouvez-vous s'il vous plaît dites-moi comment passez-vous someValueAtRuneTime? un exemple de cela s'il vous plaît. – wandos

51

Je suggère de déclarer cela avec la configuration StructureMap. En utilisant le code StructureMap légèrement plus récent:

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

De cette façon, vous encombrez pas votre code client d'avoir à connaître la valeur et peut garder votre configuration IoC séparée de votre code principal.

+1

Je suppose que c'est l'endroit où vous configurez StructureMap. Comment passez-vous le 'someValueAtRunTime' là? – user1713059