【问题标题】:How to pass arguments to a constructor in an IOC-framework如何将参数传递给 IOC 框架中的构造函数
【发布时间】:2008-09-24 19:32:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 有人知道如何用 Unity 做到这一点吗?

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


【解决方案1】:

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

【讨论】:

  • 这应该是答案
【解决方案2】:

对于温莎城堡:

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

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

使用结构映射:

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        其他 IoC 框架功能更丰富。

        即使用 Autofac 查看ParameterResolution

        【讨论】:

        • 我不得不再次否决它的虚假信息。 SM 支持用户的要求,因此更“功能丰富”的内容与解决发帖人的问题无关。
        【解决方案7】:

        Windsor 也可以轻松做到这一点

        【讨论】:

          猜你喜欢
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多