Rebus,将Castle Windsor与Rebus结合使用

时间:2020-02-27 20:14:59

标签: castle-windsor rebus rebus-azureservicebus

我正在尝试将Rebus与Azure Service Bus和Castle Windsor一起使用。 当我使用不带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...");
    }
}

..但是当我尝试使用温莎城堡时,仅创建了队列(无主题):

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 个答案:

答案 0 :(得分:1)

使用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>();

我敢打赌,您会得到预期的话题! ?


PS:预订IBusItem无效,除非您修改Rebus将.NET类型映射到主题的方式。当您发布SomeMessage的实例时,它将被发布到以该类型命名的主题(例如,类似SomeNamespace.SomeMessage__SomeAssembly的主题)。

尽管如此,您仍然可以使用处理程序实现IHandleMessages<IBusItem>。收到消息后,多态调度机制即会启动,因此只要您订阅了所有必需的类型,调度机制就会调度给所有兼容的处理程序。