【问题标题】:Windsor Func<T> property injectionWindsor Func<T> 属性注入
【发布时间】:2011-02-14 06:03:04
【问题描述】:

使用 Windsor 2.5.2,以下工作:

public class Foo
{
    public IBar Bar { get; set; }
}

要延迟创建 IBar,这也可以:

public class Foo
{
    public Foo(Func<IBar> barFactory)
    { 
    }
}

但是,如果我将属性注入与Func&lt;T&gt; 结合使用,则会导致空引用:

public class Foo
{
    public Func<IBar> Bar { get; set; }
}

如何让 Windsor 注入 Func&lt;IBar&gt;

【问题讨论】:

    标签: castle-windsor ioc-container property-injection


    【解决方案1】:

    这是一个很好的问题,保罗。很高兴你问。

    对于隐式注册的Funcs,Windsor 正在查看该属性,认为它是可选的,它只是不费心去尝试获取它,因为...嗯 - 它是可选的,所以你肯定很高兴没有已填充依赖项。

    要填充它,您可以显式注册工厂

    container.Register(Component.For<Func<IBar>>().AsFactory().Lifestyle.Transient);
    

    或者您根据需要标记依赖项(在 ComponentModel 上使用 Require 方法),这可能最好通过 IComponentModelConstructionContributor 完成

    【讨论】:

    • “不费心去尝试得到它,因为......好吧 - 它是可选的” - 在这种情况下,为什么它会解析 IBar?看起来很矛盾。
    • IBar 已注册,因此已解决。没有特殊情况,Func 被视为与任何其他组件一样,并符合与任何其他组件相同的规则。并且规则是 Windsor 不会询问 ILazyComponentLoaders 的可选依赖项,这就是 Funcs 隐式注册的方式。它实际上是一致的,尽管对于来自 Autofac 的人来说表现不同,对 relationship 类型有特殊处理,包括 Funcs
    • 郑重声明,在即将发布的 Windsor 版本(代号 Wawel)中,行为发生了变化,并将按照 Paul 的要求工作。
    • @KrzysztofKozmic 明确一点:这确保了代表的生活方式是短暂的,而不是 IBar 对吧?我们可能永远不需要临时委托。
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多