如何将参数传递给IOC框架中的构造函数? 我想做类似的事情:(试图成为IOC框架不可知;)
object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor);
public class MyLogging : ILogging
{
public MyLogging(object objectToLogFor){}
}
似乎这在StructureMap中是不可能的。但我很乐意看到有人证明我错了。
其他框架是否功能更丰富?或者我是以错误的方式使用IOC框架?
答案 0 :(得分:9)
在结构图中,您可以使用With方法实现此目的:
string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();
答案 1 :(得分:5)
对于Castle Windsor:
var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });
注意使用匿名对象来指定构造函数参数。
使用StructureMap:
var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
答案 2 :(得分:4)
这怎么能与语言无关?这是相关框架的实现细节。
Spring允许您将c'tor args指定为值/引用列表,如果这是你的事情。但是,与属性注入相比,它不是很易读。
有些人对此问题很热议,并且坚持认为c'tor注入是java中唯一的线程安全方法。从技术上讲,它们是正确的,但实际上它并不重要。
答案 3 :(得分:3)
这不应该是一个非常普遍的需求,但有时它是一个有效的需求。 Ninject比StructureMap轻,允许您在从上下文中检索瞬态对象时传递参数。 Spring.NET也是。
大多数情况下,在IoC容器中声明的对象不是瞬态的,并且通过构造函数/属性/方法接受其他非临时对象作为依赖项。
但是,如果您真的不想将容器用作工厂,并且如果您对要解析的对象有足够的控制权,则可以使用属性或方法注入,即使它听起来不那么自然且风险更大某种方式。
答案 4 :(得分:0)
是的,其他框架功能更丰富 - 您需要使用允许构造函数注入的ioc框架。 Spring是一个允许构造函数依赖注入的多语言ioc容器的例子。
答案 5 :(得分:0)
答案 6 :(得分:0)
您也可以轻松地使用Windsor