如何使用事件扩展课程

时间:2019-03-23 08:06:03

标签: c# class inheritance events extension-methods

我写了一个库,该库正在实现第三方协议。该协议遵循发布-订阅模式(通过MQTT)。因此,基本上对于每条消息,我都有一个Publisher方法和一个事件,当某种类型的消息到达时会触发该事件。现在,根据我的需要,我想用自己的消息扩展此协议。而且,我已经制定了以下两个要求:

  • 仅遵循协议体系结构,保持基本库干净
  • 以某种方式用我自己的消息扩展基本库,因此在代码中,您可以将原始消息与我自己的消息一起使用在一个类中。

我在这里考虑两个选择。首先是使用C#扩展方法。我在此选项中看到的最大优点是能够仅使用具有标准协议体系结构的一类,并且在需要的情况下,可以添加对具有扩展名的程序集的引用,并将扩展库与我的专有消息一起使用。无需重构。另一方面,扩展只是静态方法,不支持事件。

我看到的第二个选项是继承一个新类,并使用基本库作为基础。这样做的巨大好处是,我可以在派生类中做我想做的所有事情。但是,如果经过一番编码后决定使用扩展库,则需要进行重构。在这里,我正在考虑使用与基类相同的名称来命名继承的类,但是在不同的命名空间中,因此在需要的情况下,可以更改using语句形式

using Hermes

进入

using Hermes.Extended

,其他所有内容都应该起作用。但是在我看来,这种解决方法似乎有些肮脏。

有人可以建议我正确的方法,如何解决这个问题?最好的架构是什么?我还有其他看不到的方式吗?

作为参考,我还提供了一个基础类的片段,该片段正在处理一条消息。无论采用哪种形式的扩展,其基本功能都应该相同,只是对于我自己的类型。

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);
}

谢谢。

吉里

0 个答案:

没有答案