加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Windsor自动订阅具有自定义功能的事件聚合器

发布时间:2020-12-15 07:43:05 所属栏目:百科 来源:网络整理
导读:阅读 this博客文章,它提到你可以让你的DI容器自动订阅事件,如果它实现了IHandle.这正是我想要完成的. 这是我到目前为止所拥有的. container.Register(Component .ForMainWindowViewModel() .ImplementedByMainWindowViewModel() .LifeStyle.Transient .OnCre
阅读 this博客文章,它提到你可以让你的DI容器自动订阅事件,如果它实现了IHandle<>.这正是我想要完成的.

这是我到目前为止所拥有的.

container.Register(Component
    .For<MainWindowViewModel>()
    .ImplementedBy<MainWindowViewModel>()
    .LifeStyle.Transient
    .OnCreate((kernel,thisType) => kernel.Resolve<IEventAggregator>().Subscribe(thisType)));

虽然此代码成功订阅MainWindowViewModel以接收已发布的消息,但实际接收消息的时间没有任何反应.如果我按预期手动订阅所有工作.

这是我的MainWindowViewModel类.

public class MainWindowViewModel : IHandle<SomeMessage>
{
    private readonly FooViewModel _fooViewModel;
    private readonly IEventAggregator _eventAggregator;

    public MainWindowViewModel(FooViewModel fooViewModel,IEventAggregator eventAggregator)
    {
        _fooViewModel = fooViewModel;
        _eventAggregator = eventAggregator;

        //_eventAggregator.Subscribe(this);

        _fooViewModel.InvokeEvent();
    }

    public void Handle(SomeMessage message)
    {
        Console.WriteLine("Received message with text: {0}",message.Text);
    }
}

如果任何类继承IHandle<&gt ;?,我如何告诉Windsor自动订阅? 我最终想出了这个订阅的自定义工具.

public class EventAggregatorFacility : AbstractFacility
{
    protected override void Init()
    {
        Kernel.DependencyResolving += Kernel_DependencyResolving;
    }

    private void Kernel_DependencyResolving(ComponentModel client,DependencyModel model,object dependency)
    {
        if(typeof(IHandle).IsAssignableFrom(client.Implementation))
        {
            var aggregator = Kernel.Resolve<IEventAggregator>();
            aggregator.Subscribe(client.Implementation);
        }
    }
}

查看Caliburn.Micro提供的EventAggregator类,我能够看到订阅成功,但是如果另一个类发布消息,则MainWindowViewModel类没有得到处理.手动订阅仍然有效,但我想自动执行此过程.我有一种感觉,它没有订阅正确的实例.但不知道如何解决这个问题.

我也尝试过使用Kernel属性公开的所有其他事件.他们中的大多数都无法解析IEventAggregator.

我错过了什么?

解决方法

“I have a feeling that it’s not subscribing the correct instance. Not
sure how to fix that,though.”

您正在订阅实现的类型(System.Type的实例),而不是正在解析的实际依赖项.这条线:

aggregator.Subscribe(client.Implementation);

应该

aggregator.Subscribe(dependency);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读