2010-07-19 6 views
1

Je voudrais pouvoir injecter des dépendances nommées dans une classe en utilisant StructureMap si cela est possible. La principale raison pour laquelle je veux cela maintenant est pour l'injection de chaîne de connexion.Est-il possible de nommer une dépendance avec StructureMap?

je faire cela dans le mauvais sens, mais voici comment je l'ai (juste besoin d'ajouter l'injection maintenant):

psuedo:

public class MyServiceClass 
    string connectionString; 

    public MyServiceClass(string connectionString) 
      this.connectionString = connectionString; 

    public void DeleteObject 
      var db = new EntitiesObject(connectionString) 

Est-il possible de mettre un name sur le paramètre constructeur de la chaîne de connexion afin que StructureMap sache comment l'injecter?

EDIT: Je pourrais avoir plusieurs chaînes de connexion qui sont déterminées au moment de l'exécution à partir d'une base de données de configuration.

EDIT: Une solution que j'ai pensé est de créer un ThisDatabaseConnectionString et une classe de ThatDatabaseConnectionString ... cette façon, il pourrait injecter la chaîne de connexion en fonction du type

Répondre

1

Vous pouvez le faire (en supposant que myConnectionString est une instance de chaîne):

container.Configure(r => r 
    .ForConcreteType<MyServiceClass>() 
    .Configure.Ctor<string>().Is(myConnectionString)); 

Si vous avez aussi besoin de carte MyServiceClass à partir d'une interface (ou classe de base abstraite), vous pouvez le faire à la place:

container.Configure(r => r 
    .For<IServiceClass>() 
    .Use<MyServiceClass>() 
    .Ctor<string>().Is(myConnectionString)); 

Si vous avez déjà configuré les chaînes de connexion nommées configurées dans le conteneur, vous pouvez faire quelque chose comme ceci:

container.Configure(r => r 
    .For<string>() 
    .Use("foo") 
    .Named("connStr1")); 
container.Configure(r => r 
    .For<string>() 
    .Use("bar") 
    .Named("connStr2")); 
container.Configure(r => r 
    .ForConcreteType<MyServiceClass>() 
    .Configure.Ctor<string>().Is((IContext ctx) => 
     ctx.GetInstance<string>("connStr2"))); 
+0

pourrait avoir besoin de deux chaînes de connexion différentes (peu probable, mais il arrive) .. Je suppose que je vais probablement aller avec mon idée de créer une classe pour chaque chaîne de connexion nécessaire. –

+0

Ne pourriez-vous pas sélectionner la chaîne de connexion appropriée impérativement dans le cadre de la configuration de votre conteneur? –

+0

BTW, voir si ma réponse mise à jour vous aide ... –