这可能是一个愚蠢的问题,但代表或事件是否可以在IOC容器(例如Windsor)注册?代表们是否可以在Castle Windsor国际奥委会集装箱注册?
我在设想在应用程序启动时注册事件功能,实现策略模式。
另一种方法是简单地将任何代表包装在类型中,以便与容器注册,我假定。
这可能是一个愚蠢的问题,但代表或事件是否可以在IOC容器(例如Windsor)注册?代表们是否可以在Castle Windsor国际奥委会集装箱注册?
我在设想在应用程序启动时注册事件功能,实现策略模式。
另一种方法是简单地将任何代表包装在类型中,以便与容器注册,我假定。
无需包装或子类功能在温莎注册。他们就像任何其他组件一样工作。如果您需要告知另一个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。
我会说这是不可能的,因为你会如何解决依赖性?
如果一个班级要求Func<bool>
类型的代表说,你会如何区分不同的代表?
包装委托的替代方案将是最佳解决方案,因为它允许您命名委托并将其组合到功能部分中。
编辑原来,温莎城堡有一种命名方式,因为它们在国际奥委会注册。所以这是可能的,但你仍然需要为每个实例提供某种名称。参见Mauricio Scheffer的answer。
如上所述,它工作得很好,如果您使用typed factory facility,请小心,因为它可能会出现一些意外的行为。您的委托依赖可能会产生代理工厂的创建。见this question。
好点重新解析。我要去参加代表的包装。如果你可以像命名类型那样传递命名函数,那将会很整洁。 – Ben 2010-11-24 03:34:53
您可以通过继承它们的子类来命名代表,即公共类MyDelegate:Func {} –
2010-11-24 06:52:59