【问题标题】:Castle Windsor - Lookup Method Injection for transient instancesCastle Windsor - 瞬态实例的查找方法注入
【发布时间】:2011-05-01 08:08:54
【问题描述】:

简短的问题:
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 配置,但目前我只是想让它运行)

【问题讨论】:

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


    【解决方案1】:

    城堡有更好的东西;类型化工厂。 你甚至可以注入一个委托! 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

    【讨论】:

    • 谢谢,这看起来像是我需要去的方向。我现在通过阅读工厂文档看到的唯一问题是 SomeClass 必须实际跟踪瞬态的状态并释放创建的对象(通过工厂的 Destroy),否则它不会被垃圾收集,这与 Spring 的实现不同,它将获得垃圾收集当它超出范围(如普通对象)时......这种解释是否正确?还是我错过了什么?
    • 关于我的评论...不要误会我的意思,这种实现是有道理的,因为工厂“拥有”该对象。只是想确保我正确解释了文档。
    • Windsor 可能会跟踪您拉出的对象,如果它有一些与它相关的工作,当它超出范围时必须完成。见kozmic.pl/archive/2010/08/19/…
    • 感谢 Krzysztof!我做了一些测试,看起来 Windsor 让对象像往常一样被 GC 处理。关于这一点,容器或工厂是否有一个事件在它实际“释放”它创建的瞬态对象(如果它持有它)时触发?有一个确认动作可能会让一些人对整个发布的事情感到放心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多