1

简短的问题:
Castle Windsor 是否有类似于 Spring.Net 的“查找方法注入”的东西,可以从 XML 配置,它提供了从容器中获取瞬态实例的能力,而类不知道 IoC 容器?

长问题:
我是 Spring/Spring.Net 的长期用户,我一直在尝试使用 Castle Windsor,尝试将项目移植到它上面。Spring.Net 有一个“查找方法注入”的概念(来自 Spring 文档)......

查找方法注入是容器覆盖容器管理对象上的方法的能力,以返回在容器中查找另一个命名对象的结果。查找通常涉及原型对象,如上一节中所述。Spring 框架通过使用 System.Reflection.Emit 命名空间中的类动态生成覆盖该方法的子类来实现此方法注入。

这意味着,如果我有以下...

public class SomeTransient
{
    // ... I have dependencies that need to be filled by IoC container
}

public class SomeClass
{
    public virtual void Work()
    {
        var o = CreateTransient();
    }

    public virtual SomeTransient CreateTransient() { }
}

我可以指示 Spring 覆盖 CreateTransient 方法,并让该方法在每次调用该方法时返回一个新容器创建的瞬态实例(初始化它的依赖项)。其独特之处在于,它不需要直接链接到 Spring 框架(例如,SomeClass 不必实现特定的接口)。

Castle Windsor 中是否有类似的东西可以通过 XML 实现这一点?

(我最终会远离 XML 配置,但目前我只是想让它运行)

4

1 回答 1

2

城堡有更好的东西;类型化工厂。你甚至可以注入一个委托! http://stw.castleproject.org/Windsor.Typed-Factory-Facility-delegate-based-factories.ashx

它更好,因为它不依赖于动态生成代码,并且看起来更干净。

它看起来更干净,因为该类不依赖于覆盖该方法的人。没有子类化是不可能测试这个类的。

如果你真的想做这样的事情,我希望:

public abstract class SomeClass
{
  public abstract SomeTransient CreateTransient();
}

但是......再次感觉不对劲。

编辑 2

Unity 2 支持这类委托工厂;你可以在这里阅读更多: http ://www.truewill.net/myblog/index.php/2010/05/06/unity_2_0_combining_injectionfactory_and

感谢@eiximenis

于 2010-10-27T14:40:29.327 回答