2010-05-13 82 views
36

我正在使用StructureMap作为我的DI。想象一下,我有一个类,需要1个参数,如:使用StructureMap时传递构造函数参数

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

我需要指定“的ConnectionString 在运行时当我得到IProductProvider的实例

我已经配置StructureMap如下:

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

不过,我不想叫EqualTo(“什么......”)方法,这里我需要一些工具来动态指定在运行时该值。

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

目前,我有这样的:

ObjectFactory.GetInstance<IProductProvider>(); 

但你也知道,这是行不通......

任何意见将不胜感激。

回答

32

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

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

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

+1

确保someValueAtRuntime是一个简单的值,而不是任何类型的Func或Lambda(如果可以这样做)检索它,否则该函数将在每次解析依赖项时运行。我用这个技巧来注入连接字符串,就像你在做什么一样。只要你在设置ObjectFactory之前将字符串转换成本地变量,你应该没问题。 – Mel 2011-08-09 11:59:12

+5

呦。如果我有几个参数,arg1,2,3等,我该如何传递每个参数,但将其中一个参数保留为空。这个怎么做? – 2013-02-21 15:31:54

+0

@Mosh谢谢你的回答,你怎么能告诉我你如何通过someValueAtRuneTime?它的一个例子请。 – wandos 2017-03-30 06:43:34

51

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

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

这种方式,你不必知道的价值不负担你的客户端代码并能保持你的IoC配置从主代码分开。

+1

我猜这是你配置StructureMap的地方。你如何在那里传递'som​​eValueAtRunTime'? – user1713059 2016-11-06 21:49:47

相关问题