Rebus,使用 Castle Windsor with Rebus
Rebus, using Castle Windsor with Rebus
我正在尝试将 Rebus 与 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...");
}
}
这里是message/handlers:
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; }
}
怎么了?有什么建议么?
谢谢!
使用 Rebus 和 Azure 服务总线,主题创建时间
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>
。多态派发机制在收到消息后启动,因此只要您订阅所有必要的类型,派发机制就会派发给所有兼容的处理程序。
我正在尝试将 Rebus 与 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...");
}
}
这里是message/handlers:
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; }
}
怎么了?有什么建议么? 谢谢!
使用 Rebus 和 Azure 服务总线,主题创建时间
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>
。多态派发机制在收到消息后启动,因此只要您订阅所有必要的类型,派发机制就会派发给所有兼容的处理程序。