Caliburn.Micro.使用Autofac自动为IHandle实现者调用eventaggregator.Subscribe()

Ale*_*lec 8 wpf messaging autofac eventaggregator caliburn.micro

Caliburn.Micro文档中,作者提到了这种可能性:

文档链接

IHandle继承自标记接口IHandle.这允许使用强制转换来确定对象实例是否订阅任何事件.如果您与IoC容器集成,则可以实现简单的自动订阅.大多数IoC容器(包括SimpleContainer)提供了一个钩子,用于在创建新实例时调用它.只需连接容器的回调,检查正在创建的实例以查看它是否实现IHandle,如果是,请在事件聚合器上调用Subscribe.

如何通过Autofac实现这一目标?

我试图利用装饰器的功能,但当然这对于这种情况来说是不合适的.更重要的是,默认情况下,IHandle <>的实现者没有在容器中注册为IHandle的实例.

PS提供这种不正确的实现以防万一它可能有用,但我怀疑.

builder.RegisterInstance<IEventAggregator>(new EventAggregator());
builder.RegisterDecorator<IHandle>((container, handler) =>
{
    var eventAggregator = container.Resolve<IEventAggregator>();
    eventAggregator.Subscribe(handler);
    return handler;
}, "unsubscribed", "subscribed");
Run Code Online (Sandbox Code Playgroud)

Nic*_*rdt 15

对Caliburn的工作原理做一些假设,我认为你在寻找的是:

builder.RegisterType<MyViewModel>();
builder.RegisterModule<AutoSubscribeHandlersModule>();
Run Code Online (Sandbox Code Playgroud)

模块的实现方式如下:

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);
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)