如何将参数传递给IOC框架中的构造函数

时间:2008-09-24 19:32:11

标签: language-agnostic inversion-of-control structuremap

如何将参数传递给IOC框架中的构造函数? 我想做类似的事情:(试图成为IOC框架不可知;)

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

似乎这在StructureMap中是不可能的。但我很乐意看到有人证明我错了。

其他框架是否功能更丰富?或者我是以错误的方式使用IOC框架?

7 个答案:

答案 0 :(得分:9)

在结构图中,您可以使用With方法实现此目的:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

请参阅:http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

答案 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)

其他IoC框架功能更丰富。

即。使用Autofac

查看ParameterResolution

答案 6 :(得分:0)

您也可以轻松地使用Windsor