EventAggregator - получить список подписчиков

Есть ли способ получить список подписчиков на конкретное событие, используя EventAggregator с Unity и PRISM?

Я знаю, что некоторые люди скажут: «Почему вы хотите это знать, весь смысл использования EventAggregator заключается в том, чтобы нам не было дела до того, кто и сколько подписчиков».

Это чисто упражнение, которое я хочу выполнить не для какой-то конкретной цели.

EventAggregator должен хранить список подписчиков, есть ли способ раскрыть этот список?


person gheff    schedule 31.07.2017    source источник


Ответы (1)


Да, информация о подписчике содержится в графе объектов EventAggregator. К сожалению (по вашему запросу), эта информация хранится в частных полях.

События хранятся в приватном Dictionary<Type, EventBase> events. Подписки хранятся в самом событии (в EventBase) как

private readonly List<IEventSubscription> _subscriptions = new List<IEventSubscription>();

Один из вариантов получения информации о подписке - использовать отражение для доступа к закрытым переменным-членам (при условии, что существует разрешение на отражение).

Если вы можете изменить события, тогда другой вариант - раскрыть эту информацию через конкретный PubSub<EventBase>, поскольку EventBase разрешает доступ к подпискам для подклассов через свойство protected ICollection<IEventSubscription> Subscriptions. Например:

public class MyEvent : PubSubEvent<MyEventData>
{
    public new ICollection<IEventSubscription> Subscriptions => base.Subscriptions;
}

Затем вы можете запросить событие:

var myEvent = eventAggregator.GetEvent<MyEvent>();
var sub = (EventSubscription<MyEventData>) myEvent.Subscriptions.FirstOrDefault();
MethodInfo method = sub.Action.Method;
object target = sub.Action.Target;

Если вам не нужны конкретные данные EventSubscription<T> (например, вы просто хотите знать количество подписок), вы можете избежать конкретного приведения и использовать интерфейс IEventSubscription.

person Randy supports Monica    schedule 31.07.2017
comment
Я вижу ценность в этом вопросе. Иногда, когда код необходимо пересмотреть и переработать, eventAggregator, по-видимому, работает против, потому что трудно отлаживать и отслеживать последовательность обработок всеми подписчиками, которые должны быть видимыми и рассматриваться как часть повторного посещения. Видите ли вы недостатки в использовании EventAggregator? Иногда это становится сложно отследить, как паутину. - person swcraft; 10.05.2018
comment
Спасибо за ответ, это действительно помогает.! :) - person Ankit Dhadse; 14.11.2019