2010-11-24 63 views

回答

7

无需包装或子类功能在温莎注册。他们就像任何其他组件一样工作。如果您需要告知另一个Func<int>,请使用命名组件和服务覆盖,就像使用其他组件一样。例如:

[Test] 
public void Example() { 
    var container = new DefaultKernel(); 
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42")); 
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44")); 
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44"))); 
    var s = container.Resolve<Something>(); 
    Assert.AreEqual(44, s.I); 
} 

class Something { 
    private readonly int i; 
    public Something(Func<int> f) { 
     i = f(); 
    } 

    public int I { 
     get { return i; } 
    } 
} 

如果你正在寻找使用容器脱钩的事件注册,只需使用Event wiring facility

0

我会说这是不可能的,因为你会如何解决依赖性?

如果一个班级要求Func<bool>类型的代表说,你会如何区分不同的代表?

包装委托的替代方案将是最佳解决方案,因为它允许您命名委托并将其组合到功能部分中。

编辑原来,温莎城堡有一种命名方式,因为它们在国际奥委会注册。所以这是可能的,但你仍然需要为每个实例提供某种名称。参见Mauricio Scheffer的answer

+0

好点重新解析。我要去参加代表的包装。如果你可以像命名类型那样传递命名函数,那将会很整洁。 – Ben 2010-11-24 03:34:53

+0

您可以通过继承它们的子类来命名代表,即公共类MyDelegate:Func {} – 2010-11-24 06:52:59

0

如上所述,它工作得很好,如果您使用typed factory facility,请小心,因为它可能会出现一些意外的行为。您的委托依赖可能会产生代理工厂的创建。见this question