c# - 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>
。
- 我现在想支持订阅多个事件的类。
- 我还希望通过查看实现的接口/继承的类来订阅哪些事件。
ISubscriber
必须是非泛型类型,以便我可以将其存储在列表中。我目前的解决方案是让类继承自SubscriberBase<T>
,然后让一个内部类继承SubscriberBase<T>
另一个事件。
这个解决方案当然不能满足 2。这就是我寻找另一种方式的原因。
我还考虑过引入IGenericSubscriber<T>
另一个ISubscriber
以void Notify(T @event);
.
然后订阅者类将继承SubscriberBase<T>
并实现IGenericSubscriber<T>
.
我遇到的问题是,如果我想订阅两个以上的事件,该void Notify(IEvent @event)
方法必须Notify
根据给定的具体类型决定调用哪个重载IEvent
。
这个问题有什么优雅的解决方案可以满足我的需求吗?任何想法都受到高度赞赏!
解决方案
推荐阅读
- c++ - 如何使用完全限定名继承基类的构造函数?
- java - 当比较基于我自己的方法的结果时,我可以使用 Comparator.comparing() 定义一个新的比较器吗?
- testing - 我在 GitLab CI 中的测试阶段不会被管道拾取
- r - 为什么 case_when 序列中的最后一个案例通常称为 TRUE?
- apache-kafka - 如何在代码中计算 Kafka *会发送(并且之前确实发送过)*发送消息的分区?
- r - 在 Rmd 中获取文件时遇到问题
- java - 当记录存在时,结果集返回空。语句在控制台中执行时有效,而不是在代码中。为什么?
- sql - 有没有办法在没有唯一性的情况下防止插入特定情况?
- excel - 将多个工作表从一个工作簿复制到一个新工作簿,但复制值而不是公式。然后在当前目录中保存为今天的日期
- javascript - 在 Django 中使用 jquery 在 for 循环中刷新内容