使用StructureMap时传递构造函数参数

时间:2010-05-13 02:17:16

标签: dependency-injection constructor structuremap

我正在为我的DI使用StructureMap。想象一下,我有一个类需要1个参数:

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

当我获得IProductProvider的实例时,我需要在运行时指定“connectionString

我已按如下方式配置StructureMap:

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

但是,我不想在这里调用EqualTo(“something ......”)方法,因为我需要一些工具来在运行时动态指定这个值。

我的问题是:如何使用ObjectFactory获取IProductProvider的实例?

目前,我有类似的内容:

ObjectFactory.GetInstance<IProductProvider>();  

但是如你所知,这不起作用......

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:52)

我建议使用StructureMap配置声明。使用稍微更新的StructureMap代码:

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

这样,您不必担心客户端代码必须知道该值,并且可以将IoC配置与主代码分开。

答案 1 :(得分:32)

我自己找到了答案!这是解决方案:

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

希望这可以帮助遇到同样问题的其他人。

答案 2 :(得分:0)

如果您正在运行Structuremap 2.6.x,则必须执行以下操作:

For<IProductProvider>().Use<ProductProvider>().WithProperty("name").EqualTo(someValueAtRunTime);

确保属性名称与构造函数参数匹配。

如果您的参数来自应用设置,请使用以下行:

.WithProperty("").EqualToAppSetting("")