C# 如何使用事件扩展类
我编写了一个库,它实现了第三方协议。此协议遵循发布-订阅模式(通过MQTT)。所以基本上,对于每一条消息,我都有一个发布者方法和一个事件,当某种类型的消息到达时会触发它。现在,出于我的需要,我想用我自己的消息扩展这个协议。但是,我也提出了这两个要求:C# 如何使用事件扩展类,c#,class,inheritance,events,extension-methods,C#,Class,Inheritance,Events,Extension Methods,我编写了一个库,它实现了第三方协议。此协议遵循发布-订阅模式(通过MQTT)。所以基本上,对于每一条消息,我都有一个发布者方法和一个事件,当某种类型的消息到达时会触发它。现在,出于我的需要,我想用我自己的消息扩展这个协议。但是,我也提出了这两个要求: 仅按照协议体系结构保持基本库的干净 以某种方式用我自己的消息扩展基本库,因此在代码中,您可以在一个类中使用原始消息和我自己的消息 我在考虑两种选择。首先是使用C#扩展方法。我在这个选项中看到的最大优势是,能够在标准协议体系结构中只使用一个类,并
- 仅按照协议体系结构保持基本库的干净
- 以某种方式用我自己的消息扩展基本库,因此在代码中,您可以在一个类中使用原始消息和我自己的消息
using Hermes
进入
其他一切都应该起作用。但在我看来,这种变通办法似乎有些肮脏
谁能告诉我正确的方法,如何解决这项任务?这方面最好的架构是什么?还有其他我看不到的方法吗
为了供您参考,我还提供了一个来自基本类的片段,它处理一条消息。任何形式的扩展都应该基本相同,只使用我自己的类型
public async Task NotificationOnAsync(NotificationSwitch Payload)
{
await PublishToBroker(String.Format("hermes/feedback/sound/toggleOn"), Payload.ToJSON());
}
private EventHandler<NotificationSwitchEventArgs> _notificationTurnedOn;
private object _notificationTurnedOnLock = new object();
public event EventHandler<NotificationSwitchEventArgs> NotificationTurnedOn
{
add
{
lock (_notificationTurnedOnLock)
{
_notificationTurnedOn += value;
SubscribeTopic("hermes/feedback/sound/toggleOn");
}
}
remove
{
lock (_notificationTurnedOnLock)
{
_notificationTurnedOn -= value;
if (_notificationTurnedOn is null) UnsubscribeTopic("hermes/feedback/sound/toggleOn");
}
}
}
protected virtual void OnNotificationTurnedOn(NotificationSwitchEventArgs e)
{
_notificationTurnedOn?.Invoke(this, e);
}
公共异步任务NotificationAsync(NotificationSwitch有效负载)
{
等待PublishToBroker(String.Format(“hermes/feedback/sound/toggleOn”)、Payload.ToJSON();
}
私有事件处理程序通知已打开;
私有对象_notificationTurnedOnLock=新对象();
公共事件事件处理程序NotificationTurnedOn
{
添加
{
锁定(_notificationTurnedOnLock)
{
_notificationTurnedOn+=值;
SubscribeTopic(“爱马仕/反馈/声音/开关”);
}
}
去除
{
锁定(_notificationTurnedOnLock)
{
_notificationTurnedOn-=值;
如果(_notificationTurnedOn为空)取消订阅主题(“hermes/反馈/声音/切换”);
}
}
}
NotificationTurnedOn上受保护的虚拟无效(NotificationSwitchEventArgs e)
{
_notificationTurnedOn?调用(this,e);
}
谢谢
Jiri本主题属于正面模式,适合您的情况。本主题属于正面模式,适合您的情况。
public async Task NotificationOnAsync(NotificationSwitch Payload)
{
await PublishToBroker(String.Format("hermes/feedback/sound/toggleOn"), Payload.ToJSON());
}
private EventHandler<NotificationSwitchEventArgs> _notificationTurnedOn;
private object _notificationTurnedOnLock = new object();
public event EventHandler<NotificationSwitchEventArgs> NotificationTurnedOn
{
add
{
lock (_notificationTurnedOnLock)
{
_notificationTurnedOn += value;
SubscribeTopic("hermes/feedback/sound/toggleOn");
}
}
remove
{
lock (_notificationTurnedOnLock)
{
_notificationTurnedOn -= value;
if (_notificationTurnedOn is null) UnsubscribeTopic("hermes/feedback/sound/toggleOn");
}
}
}
protected virtual void OnNotificationTurnedOn(NotificationSwitchEventArgs e)
{
_notificationTurnedOn?.Invoke(this, e);
}