首页 > 解决方案 > 每次我必须订阅事件时获取事件聚合器的实例?

问题描述

我有三个 WPF 应用程序必须订阅的事件。每次我必须订阅事件时是否需要获取事件聚合器的实例?

这是我现在的做法:

                IEventAggregator eventAggregator = new EventAggregator();
                eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
                eventAggregator.GetEvent<IncidentInfoReadyEvent>().Subscribe(OnIncidentInfoReady);

                eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
                eventAggregator.GetEvent<IncidentInfoReadyEvent2>().Subscribe(OnIncidentInfoReady2);

                eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
                eventAggregator.GetEvent<ArrestInfoReadyEvent>().Subscribe(OnArrestInfoReady);

我可以这样做吗:

                IEventAggregator eventAggregator = new EventAggregator();
                eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
                eventAggregator.GetEvent<IncidentInfoReadyEvent>().Subscribe(OnIncidentInfoReady);
                eventAggregator.GetEvent<IncidentInfoReadyEvent2>().Subscribe(OnIncidentInfoReady2);
                eventAggregator.GetEvent<ArrestInfoReadyEvent>().Subscribe(OnArrestInfoReady);

标签: c#prism

解决方案


You just need to do dependency injection in your class.

public class MainViewModel : ViewModelBase
{
    private readonly IEventAggregator _eventAggregator;

    public MainViewModel(IEventAggregator eventAggreator)
    {
        _eventAggregator = eventAggregator;

        _eventAggregator.GetEvent<MyEventOne>().Subscribe(() => DoSomething());
        _eventAggregator.GetEvent<MyEventTwo>().Subscribe(() => DoSomething());
        _eventAggregator.GetEvent<MyEventThree>().Subscribe(() => DoSomething());
    }
}

There is no need to take a new instance each time. But you should register logger in container as singleton.


推荐阅读