【问题标题】:Caliburn.Micro. Automatically call eventaggregator.Subscribe() for IHandle implementors with AutofacCaliburn.Micro。使用 Autofac 为 IHandle 实现者自动调用 eventtaggregator.Subscribe()
【发布时间】:2011-10-15 19:28:21
【问题描述】:

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

documentation link

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

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

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

【问题讨论】:

    标签: wpf messaging autofac caliburn.micro eventaggregator


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      对 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);
                  };
              }
          }
      }
      

      【讨论】:

      • Doh,再次在终点线被击败! :)
      • 确实满足了我现在的需求。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多