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

时间:2020-03-06 14:41:05  来源:igfitidea点击:

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

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

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

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

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

解决方案

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

这如何与语言无关?这是所讨论框架的实现细节。

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

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

这应该不是很普遍的需求,但有时却是有效的需求。 Ninject比StructureMap轻,它允许我们从上下文中检索瞬态对象时传递参数。 Spring.NET也是如此。

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

但是,如果我们确实不想将容器用作工厂,并且对要解析的对象有足够的控制权,则即使使用某种方式听起来更自然,风险更大,也可以使用属性或者方法注入。

其他IoC框架功能更丰富。

IE。使用Autofac查看ParameterResolution

在结构图中,我们可以使用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

我们也可以轻松地通过温莎做到这一点

温莎城堡:

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

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

使用StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();