我正在为我的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>();
但是如你所知,这不起作用......
任何建议都将不胜感激。
答案 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("")