2008-09-24 62 views
11

如何将参数传递给IOC框架中的构造函数? 我想要做的事,如:(试图成为IOC框架无关;))如何将参数传递给IOC框架中的构造函数

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

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

看来,这是不可能的StructureMap。但我很想看到有人证明我错了。

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

+1

有人知道如何使用Unity做到这一点? – mhamrah 2009-02-27 17:28:04

回答

0

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

+0

SM确实允许这样做,因此反对投票 – Schneider 2009-04-16 14:37:54

4

这怎么可能是语言不可知的?这是有关框架的实现细节。

Spring允许您指定c'tor参数作为值/参考的列表,如果这是您的事情。尽管如此,与财产注入相比,它不是很可读。

有些人因此受到关注,并坚持c'tor注入是java中唯一的线程安全方法。从技术上讲,他们是正确的,但在实践中它往往不重要。

3

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

大多数情况下,在IoC容器中声明的对象不是瞬态的,并且通过构造函数/属性/方法接受其他非瞬态对象作为依赖关系。但是,如果您真的不想将容器用作工厂,并且如果您对要解析的对象具有足够的控制权,即使听起来不那么自然且风险更高,也可以使用属性或方法注入某种程度上来说。

0

其他IoC框架功能更丰富。

I.e.检查出ParameterResolution与Autofac

+0

我再次投票表示这是它的虚假信息。 SM支持用户所要求的内容,所以更多“功能丰富”与解决海报问题无关。 – Schneider 2009-04-16 14:40:40

0

你也可以做到这一点与温莎容易

5

对于城堡温莎:

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

note使用匿名对象来指定构造函数参数。

使用StructureMap:

var foo = "foo"; 
var service = container.With(foo).GetInstance<TContract>(); 
相关问题