首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rebus,使用城堡温莎与Rebus

Rebus,使用城堡温莎与Rebus
EN

Stack Overflow用户
提问于 2020-02-27 20:14:59
回答 1查看 69关注 0票数 0

我正在尝试使用Rebus与Azure服务巴士和城堡温莎。当我使用我的代码版本而没有Castle时,队列和主题将被正确地创建:

代码语言:javascript
复制
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...");
    }
}

..but当我尝试使用城堡温莎时,只创建队列(没有主题):

代码语言:javascript
复制
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...");
    }
}

在这里,消息/处理程序:

代码语言:javascript
复制
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; }
}

怎么啦?有什么建议吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-27 21:24:56

使用Rebus和Azure服务总线,当

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

当我比较您的两个代码片段时,这两行

代码语言:javascript
复制
activator.Bus.Subscribe<SomeMessage>().Wait();
activator.Bus.Subscribe<IBusItem>().Wait();

从第二段中消失了。

如果你这样做:

代码语言:javascript
复制
var bus = container.Resolve<ISyncBus>(); //< NOTE: SYNC BUS!

bus.Subscribe<SomeMessage>();

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

PS:订阅IBusItem没有任何效果,除非您修改了Rebus如何将.NET类型映射到主题。当您发布SomeMessage实例时,它将被发布到以该类型命名的主题(例如,类似于SomeNamespace.SomeMessage__SomeAssembly)。

不过,您仍然可以有一个实现IHandleMessages<IBusItem>的处理程序。在接收到消息后,多态分派机制就会启动,因此只要订阅所有必要的类型,分派机制就会分派给所有兼容的处理程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60441098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档