Как расширить класс с событиями - PullRequest
1 голос
/ 23 марта 2019

Я написал библиотеку, которая реализует сторонний протокол.Этот протокол следует шаблону публикации-подписки (через MQTT).Таким образом, в основном для каждого сообщения у меня есть метод издателя и событие, которое вызывается, когда приходит сообщение определенного типа.Теперь для своих нужд я хочу расширить этот протокол своими сообщениями.Но также я изложил эти два требования:

  • Содержать базовую библиотеку в чистоте только в соответствии с архитектурой протокола
  • Как-то расширить базовую библиотеку своими собственными сообщениями, поэтому в кодеВы можете использовать оригинальные сообщения вместе с моими собственными сообщениями в одном классе.

Я думаю о двух вариантах здесь.Во-первых, использовать методы расширений 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);
}

Спасибо.

Иржи

...