Rebus - Rabbitmq отобразит все объекты в указанном пространстве имен / сборке - PullRequest
2 голосов
/ 23 января 2020

В моем приложении я настраиваю Producer с Rabbitmq. моя конфигурация выглядит так:

using (var adapter = new BuiltinHandlerActivator())
      {

        Configure.With(adapter)
            .Logging(l => l.ColoredConsole(LogLevel.Warn))
            .Transport(t => t.UseRabbitMqAsOneWayClient(connection))
            .Routing(r => r.TypeBased().MapAssemblyOf<TestClass>(queueName))
            .Start();
        await adapter.Bus.Publish(new TestClass() { Name = "TestName123" });
      }

Где есть много других Dtos, которые я хочу отобразить так же, как TestClass. Могу ли я указать пространство имен / сборку в маршрутизации (..)? Чтобы все объекты / dtos в этом пространстве имен были сопоставлены? Другие классы такие же, как показано ниже

public class TestClass
  {
    public String Name { get; set; }
    public String Date { get; set; }
  }

public class NewTest 
  {
    public string Name { get; set; }
  }

С другой стороны я использую WindsorContainer, и он выглядит примерно так:

public class Handle : IHandleMessages<TestClass>,IHandleMessages<NewTest>
  {
    Task IHandleMessages<TestClass>.Handle(TestClass message)
    {
      return null;
    }

    Task IHandleMessages<NewTest>.Handle(NewTest message)
    {
      return null;
    }
  }

1 Ответ

0 голосов
/ 23 января 2020

Когда вы

await bus.Publish(new TestClass(...));

вам не нужно ничего сопоставлять, так как PUBLISHING с Rebus распространит копию сообщения о событии всем, кто подписан.

Поэтому, чтобы получить В опубликованном экземпляре TestClass ваши подписчики просто должны

await bus.Subscribe<TestClass>();

. Это создаст необходимые привязки в RabbitMQ, сделав так, что все опубликованные события этого типа будут распространяться среди подписчиков.

Я рекомендую вам go обратиться к консоли управления RabbitMQ (обычно размещенной на http://<rabbitmq-hostname>:15672) и посмотреть, как выглядит топология до / после подписки.

...