Castle Windsor - 用于瞬态实例的查找方法注入

时间:2010-10-27 13:44:00

标签: spring methods castle-windsor code-injection transient

简短的问题:
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 Framework(例如,SomeClass不必实现特定的接口)。

Castle Windsor有类似的东西可以通过XML实现这一目标吗?

(我最终会放弃XML配置,但目前我只是想让它运行起来)

1 个答案:

答案 0 :(得分: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