Я написал библиотеку, которая реализует сторонний протокол.Этот протокол следует шаблону публикации-подписки (через 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);
}
Спасибо.
Иржи