首页 > 解决方案 > Publish-Subscribe 通过继承订阅多个事件

问题描述

我当前的 Publish-Subscribe 实现包含以下类型。

class EventBus
{
    readonly IDictionary<Type, IList<ISubscriber>> _subscribers = new Dictionary<Type, IList<ISubscriber>>();

    void Publish<T>(T @event) where T : IEvent
    {
        if (_subscribers.ContainsKey(typeof(T)))
        {
            foreach (var subscriber in _subscribers[typeof(T)])
                subscriber.Notify(@event);
        }
    }

    void Subscribe(ISubscriber subscriber) { }

    void Unsubscribe(ISubscriber subscriber) { }
}

interface IEvent {
}

interface ISubscriber
{
    void Notify(IEvent @event);
}

abstract class SubscriberBase<T> : ISubscriber where T : IEvent
{
    public SubscriberBase()
    {
        // Subscribe to EventBus
    }

    public void Notify(IEvent @event)
    {
        Notify((T)@event);
    }

    protected abstract void Notify(T @event);
}

目前想要订阅 EventBus 的类继承SubscriberBase<T>

  1. 我现在想支持订阅多个事件的类。
  2. 我还希望通过查看实现的接口/继承的类来订阅哪些事件。

ISubscriber必须是非泛型类型,以便我可以将其存储在列表中。我目前的解决方案是让类继承自SubscriberBase<T>,然后让一个内部类继承SubscriberBase<T>另一个事件。
这个解决方案当然不能满足 2。这就是我寻找另一种方式的原因。

我还考虑过引入IGenericSubscriber<T>另一个ISubscribervoid Notify(T @event);.
然后订阅者类将继承SubscriberBase<T>并实现IGenericSubscriber<T>.
我遇到的问题是,如果我想订阅两个以上的事件,该void Notify(IEvent @event)方法必须Notify根据给定的具体类型决定调用哪个重载IEvent

这个问题有什么优雅的解决方案可以满足我的需求吗?任何想法都受到高度赞赏!

标签: c#publish-subscribemultiple-inheritancegeneric-interface

解决方案


推荐阅读