Dependency injection 是否可以使用StructureMap命名依赖项?

Dependency injection 是否可以使用StructureMap命名依赖项?,dependency-injection,.net-4.0,structuremap,Dependency Injection,.net 4.0,Structuremap,如果可能的话,我希望能够使用StructureMap将命名依赖项注入到类中。我现在想要这个的主要原因是为了连接字符串注入 我可能做得不对,但我是这样做的(现在只需要添加注射剂): 普苏埃多: public class MyServiceClass string connectionString; public MyServiceClass(string connectionString) this.connectionString = connectio

如果可能的话,我希望能够使用StructureMap将命名依赖项注入到类中。我现在想要这个的主要原因是为了连接字符串注入

我可能做得不对,但我是这样做的(现在只需要添加注射剂):

普苏埃多:

public class MyServiceClass
     string connectionString;

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

     public void DeleteObject
          var db = new EntitiesObject(connectionString)
有没有办法在连接字符串构造函数参数上加上一个名称,以便StructureMap知道如何注入它

编辑:我可以有多个连接字符串,这些字符串是在运行时从配置数据库确定的

编辑:我想到的一个解决方案是创建ThisDatabaseConnectionString和ThatDatabaseConnectionString类。。。通过这种方式,它可以基于类型注入连接字符串(假设
myConnectionString
是一个字符串实例):

container.Configure(r=>r
.ForConcreteType()
.Configure.Ctor().Is(myConnectionString));
如果还需要从接口(或抽象基类)映射MyServiceClass,可以这样做:

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

如果以前在容器中配置了命名连接字符串,则可以执行以下操作:

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")));
container.Configure(r=>r
.对于()
.使用(“foo”)
。命名为(“connStr1”);
container.Configure(r=>r
.对于()
.使用(“酒吧”)
。命名为(“connStr2”);
container.Configure(r=>r
.ForConcreteType()
.Configure.Ctor()是((IContext ctx)=>
GetInstance(“connStr2”);
您可以这样做(假设
myConnectionString
是一个字符串实例):

container.Configure(r=>r
.ForConcreteType()
.Configure.Ctor().Is(myConnectionString));
如果还需要从接口(或抽象基类)映射MyServiceClass,可以这样做:

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

如果以前在容器中配置了命名连接字符串,则可以执行以下操作:

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")));
container.Configure(r=>r
.对于()
.使用(“foo”)
。命名为(“connStr1”);
container.Configure(r=>r
.对于()
.使用(“酒吧”)
。命名为(“connStr2”);
container.Configure(r=>r
.ForConcreteType()
.Configure.Ctor()是((IContext ctx)=>
GetInstance(“connStr2”);

可能需要两个不同的连接字符串(不太可能,但确实如此)。。。我想我可能会同意为所需的每个连接字符串创建一个类的想法。难道不能在容器设置中强制选择适当的连接字符串吗?我不希望容器设置必须指定此连接字符串将使用的每个位置。除非我遗漏了什么。听起来你想建立一个基于约定的连接字符串设置?如果是这样的话,您可能想看看这个:可能需要两个不同的连接字符串(不太可能,但确实如此)。。。我想我可能会同意为所需的每个连接字符串创建一个类的想法。难道不能在容器设置中强制选择适当的连接字符串吗?我不希望容器设置必须指定此连接字符串将使用的每个位置。除非我遗漏了什么。听起来你想建立一个基于约定的连接字符串设置?如果是这样,您可能需要查看以下内容: