【发布时间】:2015-03-24 18:01:33
【问题描述】:
假设我有一个组件Bar 执行Foo 并通知所有实现IFooConsumer 接口的服务上调用FooHappened 方法。
我可以这样写Bar
class Bar
{
public Bar(IEnumerable<IFooConsumer> fooConsumers) { ... }
public void Foo()
{
// foo-ing
foreach (var f in _fooConsumers) f.FooHappened();
}
}
它会起作用,但实例化Bar 将实例化所有可能的IFooConsumers。如果我只需要通知Foo 发生时存在的那些IFooConsumer 怎么办?
有没有办法让某种跟踪器知道IFooConsumer 的所有实例化实例?
我可能可以通过订阅IWindsorContainer.Kernel.ComponentCreated 自己写一个,但是如果存在类似的东西我很感兴趣?或者也许还有其他方法可以解决我的问题?
【问题讨论】:
-
我会说你应该避免让对象事件的订阅者成为对象的依赖项。如果您试图通知事件的侦听器,您应该有一个单独的订阅者机制。例如,要将侦听器实例与
FooHappened事件相关联,请在Bar上声明FooHappenedHandler方法委托并将其设置为侦听器上的方法。然后在Foo()中调用FooHappened(this),这将允许执行由监听器定义的代码。 -
@moarboilerplate 给定温莎城堡的机制实现实际上是一个问题。具有事件或类似事件的机制是可能的,但需要显式订阅/取消订阅以避免内存泄漏。 Container 已经在内部监视对象的生命周期,所以我认为它可能在这里有一些现成的东西。
-
你可以看看 Caliburn.Micro EventAggregator。这可以很好地与 Castle.Windsor 集成。你可以扮演类似的角色。查看此链接 (github.com/marwijn/Caliburn.Micro.Windsor/blob/master/content/…) 以了解与 Windsor 的集成。
-
@Marwijn,您应该提出您的评论作为解决方案,我不知道使用设施会这么简单(至少从我所看到的来看是这样)
-
@samy 我已经把它作为一个解决方案发布了,设施真的很强大,但是一旦你找到了正确的钩子就很简单。
标签: c# castle-windsor ioc-container