12

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

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

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

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

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

4

7 回答 7

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

于 2009-02-21T17:34:38.860 回答
5

对于温莎城堡:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

请注意使用匿名对象来指定构造函数参数。

使用结构图:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
于 2009-02-25T14:17:16.197 回答
4

这怎么可能与语言无关?这是相关框架的实现细节。

Spring 允许您将 c'tor args 指定为值/引用列表,如果这是您的事情。但是,与属性注入相比,它的可读性不是很高。

有些人对此大发雷霆,坚持认为 c'tor 注入是 java 中唯一的线程安全方法。从技术上讲,它们是正确的,但实际上并不重要。

于 2008-09-24T19:40:15.567 回答
3

它不应该是一个非常普遍的需求,但有时它是一个有效的需求。Ninject比 StructureMap 更轻量,允许您在从上下文中检索瞬态对象时传递参数。Spring.NET也是。

大多数时候,在 IoC 容器中声明的对象不是瞬态的,而是通过构造函数/属性/方法接受其他非瞬态对象作为依赖项。

但是,如果您真的不想将容器用作工厂,并且如果您对要解析的对象有足够的控制权,则可以使用属性或方法注入,即使这听起来不那么自然并且在某些方面更具风险。

于 2008-09-24T20:00:15.300 回答
0

是的,其他框架功能更丰富——您需要使用允许构造函数注入的 ioc 框架。Spring 是允许构造函数依赖注入的多语言 ioc 容器的示例。

于 2008-09-24T19:35:08.467 回答
0

其他 IoC 框架功能更丰富。

即用 Autofac查看ParameterResolution

于 2008-09-30T06:13:44.137 回答
0

您也可以轻松地使用 Windsor 做到这一点

于 2009-02-25T14:05:26.847 回答