8

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

文档链接

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

如何使用 Autofac 实现这一目标?

我试图利用decorator的特性,但对于这种情况当然有点不合适。此外,默认情况下,我的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");
4

2 回答 2

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);
            };
        }
    }
}
于 2011-07-29T09:55:07.737 回答
0

这是一个旧帖子,但我想我会添加一个注释。

您可以使用 Autofac 中的构造函数来注入处理程序:

public MessageDispatcher(IEnumerable<IHandler> handlers)
{
    foreach (var handler in handlers)
        Subscribe(handler);
}

虽然上面不是 Caliburn.Micro 的 EventAggregator 基类,但您可以对其进行子类化,或更改源代码以提供您自己的 EventAggregator 构造函数。

于 2017-01-13T15:04:44.437 回答