我当前的 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>
。
- 我现在想支持订阅多个事件的类。
- 我还希望通过查看实现的接口/继承的类来订阅哪些事件。
ISubscriber
必须是非泛型类型,以便我可以将其存储在列表中。我目前的解决方案是让类继承自SubscriberBase<T>
,然后让一个内部类继承SubscriberBase<T>
另一个事件。
这个解决方案当然不能满足 2。这就是我寻找另一种方式的原因。
我还考虑过引入IGenericSubscriber<T>
另一个ISubscriber
以void Notify(T @event);
.
然后订阅者类将继承SubscriberBase<T>
并实现IGenericSubscriber<T>
.
我遇到的问题是,如果我想订阅两个以上的事件,该void Notify(IEvent @event)
方法必须Notify
根据给定的具体类型决定调用哪个重载IEvent
。
这个问题有什么优雅的解决方案可以满足我的需求吗?任何想法都受到高度赞赏!