如何在IOC框架中将参数传递给构造函数
如何在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>();