Скрыть реализацию служебной шины за интерфейсами - PullRequest
0 голосов
/ 16 января 2019

В настоящее время я работаю над проектом, который позволяет сторонним организациям подключаться к брокеру сообщений нашего продукта. Задача состоит в том, чтобы предоставить библиотеку, которую могут использовать эти третьи стороны. Я хочу иметь возможность упаковывать либо Mass Transit, либо NServiceBus вместе с ним, но я хочу скрыть эту деталь за интерфейсами.

У меня сам сервисный автобус спрятан вот так ...

public class MyServiceBus : IServiceBus {

  private readonly MassTransit.IBus _bus;
  private readonly MassTransit.IBusControl _busControl;

  public PanelSawServiceBus(MassTransit.IBus bus, MassTransit.IBusControl busControl) {
     _bus = bus;
     _busControl = busControl;
  }

  public Task PublishAsync<T>(T message, CancellationToken token = default(CancellationToken)) where T : class =>
     _bus.Publish(message, token);

  public Task SendAsync<T>(T message, CancellationToken token = default(CancellationToken)) where T : class =>
     (_bus as ISendEndpointProvider)?.Send(message, token);

  public Task StartAsync() => _busControl.StartAsync();
  public Task StopAsync() => _busControl.StopAsync();
}

Поставщик не должен иметь права публиковать / отправлять сообщения и должен только потреблять. Как я могу скрыть использование сообщений, чтобы упаковать библиотеку служебной шины и не показывать, какая библиотека используется под обложками?

Редактировать 1 Использование сообщения с помощью Mass Transit выглядит следующим образом

public class MyConsumer : IConsumer<SomeMessage> {
    public Task Consume(ConsumeContext<SomeMessage> ctx) => Task.CompletedTask;
}

Во время начальной загрузки при создании экземпляра служебной шины вы можете определить своих потребителей (Mass Transit создаст их, когда вам придет сообщение).

var busControl = Bus.Factory.CreateUsingInMemory(config => {
    config.ReceiveEndpoint("queue_name", endpointCfg => {
        endpointCfg.Consumer<MyConsumer>();
    }
};

Я хотел бы, чтобы оболочка позволила разработчику сказать: «Используя фабрику очередей, я хочу создать экземпляр с этим именем очереди, и вот имена типов, которые реализуют потребительский интерфейс, скрывающий интерфейсы технологии шины ». Я просто не знаю, смогу ли я спрятать потребителей.

1 Ответ

0 голосов
/ 16 января 2019

Если я правильно понимаю, вы хотите, чтобы ваш код не был связан ни с NServiceBus, ни с MassTransit, и вы не хотите показывать, какой из них вы используете.

Во-первых, развязка:
Вы выполнили часть этого, определив свой собственный интерфейс IServiceBus. Пока ваша библиотека зависит только от этого интерфейса, а не от какой-либо реализации, вы не должны быть связаны ни с одним из них.

Чтобы избежать такой связи, я бы оставил конкретные реализации в отдельных проектах / библиотеках. Ваш «основной» домен также не должен ссылаться напрямую. Если вы можете выполнить модульное тестирование кода без какой-либо конкретной реализации, вы можете переключаться между реализациями.

Когда вы публикуете свою библиотеку, вы можете публиковать состав вашей базовой библиотеки вместе с реализациями ее интерфейсов, которые вы выбрали.

Затем, скрывая, какая реализация используется:
Что касается не разоблачения, используете ли вы NServiceBus или MassTransit, вы не можете. Если кто-то ссылается на вашу библиотеку, и это зависит от одного из этих пакетов, ему также придется добавить этот пакет. Предполагая, что ваша библиотека упакована для NuGet, этот пакет покажет свои зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...