Ребус, используя Замок Виндзор с Ребусом - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь использовать Ребус с Azure Сервисный автобус и Замок Виндзор. Когда я использую версию своего кода без Castle Windsor, очереди и темы создаются правильно:

public static void Main(string[] args)
{
    using (var activator = new BuiltinHandlerActivator())
    {
        activator.Register(() => new SomeMessageHandler());
        activator.Register(() => new BusItemMessageHandler());
        Configure.With(activator)
            .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
            .Transport(t => t.UseAzureServiceBus(GetConnectionString(), "ReceiverInputQueue"))
            .Start();
        activator.Bus.Subscribe<SomeMessage>().Wait();
        activator.Bus.Subscribe<IBusItem>().Wait();
        Console.ReadLine();
        Console.WriteLine("Quitting...");
    }
}

.. но когда я пытаюсь использовать Castle Windsor, создаются только очереди (без тем):

public static void Main(string[] args)
{
    using (var container = new WindsorContainer())
    {
        //container.Register(Classes.FromAssemblyContaining<BusItemMessageHandler>()
        //  .BasedOn<IHandleMessages>()
        //  .WithServiceAllInterfaces()
        //  .LifestyleTransient());
        container.AutoRegisterHandlersFromAssemblyOf<BusItemMessageHandler>();
        var adapter = new CastleWindsorContainerAdapter(container);
        Configure.With(adapter)
            .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
            .Transport(t => t.UseAzureServiceBus(GetConnectionString(), "ReceiverInputQueue"))
            .Start();
        Console.WriteLine("Press ENTER to quit");
        Console.ReadLine();
        Console.WriteLine("Quitting...");
    }
}

Вот сообщения / обработчики:

public class BusItemMessageHandler : IHandleMessages<IBusItem>
{
    public async Task Handle(IBusItem message)
    {
        var a = message;
    }
}
public class SomeMessageHandler : IHandleMessages<SomeMessage>
{
    public async Task Handle(SomeMessage message)
    {
        Console.WriteLine($"Got string: {message.Message}");
    }
}
public class SomeMessage : IBusItem
{
    public Guid BusItemId { get; set; } = Guid.NewGuid();
    public DateTime Timestamp { get; set; } = DateTime.UtcNow;
    public string Message { get; set; }
}

Что не так? Какие-либо предложения? Спасибо!

1 Ответ

1 голос
/ 28 февраля 2020

С помощью Rebus и Azure Service Bus темы создаются, когда

a) издатель впервые публикует его или b) подписчик сначала подписывается на него

Когда я сравниваю ваши два фрагмента кода, две строки с

activator.Bus.Subscribe<SomeMessage>().Wait();
activator.Bus.Subscribe<IBusItem>().Wait();

отсутствуют в фрагменте № 2.

Если вы сделаете это:

var bus = container.Resolve<ISyncBus>(); //< NOTE: SYNC BUS!

bus.Subscribe<SomeMessage>();

Держу пари, вы получите ожидаемый топи c! 101


PS: подписка на IBusItem не имеет никакого эффекта, если только вы не измените способ, которым Rebus отображает. NET печатает на темы. Когда вы публикуете sh экземпляр SomeMessage, он будет опубликован в топи c, названной в честь этого типа (например, что-то вроде SomeNamespace.SomeMessage__SomeAssembly).

У вас все еще может быть реализован обработчик IHandleMessages<IBusItem> хотя. Механизм диспетчеризации polymorphi c запускается после получения сообщения, поэтому, пока вы подписываетесь на все необходимые типы, механизм диспетчеризации отправляет все совместимые обработчики.

...