在 Caliburn.Micro 文档中,作者提到了这种可能性:
IHandle继承自标记接口IHandle。这允许使用强制转换来确定对象实例是否订阅任何事件。如果您与IoC容器集成,则可以实现简单的自动订阅。大多数IoC容器(包括SimpleContainer)提供了一个钩子,用于在创建新实例时调用它。只需连接容器的回调,检查正在创建的实例以查看它是否实现IHandle,如果是,请在事件聚合器上调用Subscribe。
如何通过Autofac实现这一目标?
我尝试使用装饰器的功能,但当然这对于这种情况来说是不合适的。此外,默认情况下, IHandle<> 的实现者未在容器中注册为 IHandle 的实例。
P.S。提供此不正确的实施,以防它可能有用,但我怀疑。
builder.RegisterInstance<IEventAggregator>(new EventAggregator());
builder.RegisterDecorator<IHandle>((container, handler) =>
{
var eventAggregator = container.Resolve<IEventAggregator>();
eventAggregator.Subscribe(handler);
return handler;
}, "unsubscribed", "subscribed");
答案 0 :(得分:15)
对Caliburn如何运作做出一些假设,我认为您正在寻找的是:
builder.RegisterType<MyViewModel>();
builder.RegisterModule<AutoSubscribeHandlersModule>();
模块的实现方式如下:
class AutoSubscribeHandersModule : Module
{
protected override AttachToComponentRegistration(
IComponentRegistry registry,
IComponentRegistration registration)
{
if (typeof(IHandle).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (sender, e) => {
var aggregator = e.Context.Resolve<IEventAggregator>();
aggregator.Subscribe((IHandle)e.Instance);
};
}
}
}
答案 1 :(得分:0)
这是一篇旧帖子,但我想我只想添加一个注释。
您可以使用Autofac中的构造函数来注入处理程序:
public MessageDispatcher(IEnumerable<IHandler> handlers)
{
foreach (var handler in handlers)
Subscribe(handler);
}
虽然以上不是来自Caliburn.Micro的EventAggregator基类,但您可以对其进行子类化,或者更改源代码以为EventAggregator提供自己的构造函数。