【问题标题】:Rebus, using Castle Windsor with RebusRebus,使用 Castle Windsor 和 Rebus
【发布时间】:2020-02-28 16:18:28
【问题描述】:

我正在尝试将 Rebus 与 Azure 服务总线和 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...");
    }
}

..但是当我尝试使用 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; }
}

怎么了?有什么建议么? 谢谢!

【问题讨论】:

    标签: castle-windsor rebus rebus-azureservicebus


    【解决方案1】:

    使用 Rebus 和 Azure 服务总线,主题是在什么时候创建的

    a) 发布者首先向其发布,或 b) 订阅者首先订阅它

    当我比较你的两个代码 sn-ps 时,这两行与

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

    sn-p #2 中缺少。

    如果你这样做:

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

    我打赌你会得到预期的主题! ?


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

    您仍然可以让处理程序实现IHandleMessages&lt;IBusItem&gt;。多态调度机制在收到消息后启动,因此只要您订阅了所有必要的类型,调度机制就会调度到所有兼容的处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多