C# 配置MassTransit';初始化后的Ninject绑定
我想在代码中的某一点(使用WebActivator)配置MassTransit,并在另一点(Ninject模块)配置消息处理程序。有什么办法可以做到这一点吗?文档显示了如何在一个步骤中执行我需要的操作,但要执行其他任何操作,看起来我需要获得一个C# 配置MassTransit';初始化后的Ninject绑定,c#,ninject,masstransit,C#,Ninject,Masstransit,我想在代码中的某一点(使用WebActivator)配置MassTransit,并在另一点(Ninject模块)配置消息处理程序。有什么办法可以做到这一点吗?文档显示了如何在一个步骤中执行我需要的操作,但要执行其他任何操作,看起来我需要获得一个ServiceBusConfigurator的实例,该实例似乎无法从先前存在的IServiceBus配置中获得,IServiceBus的创建无法分离。 这意味着,您唯一的选择是在创建总线之前再收集一段时间的配置信息 如上所述,ninject提供的元数据信息
ServiceBusConfigurator
的实例,该实例似乎无法从先前存在的IServiceBus
配置中获得,IServiceBus
的创建无法分离。
这意味着,您唯一的选择是在创建总线之前再收集一段时间的配置信息
如上所述,ninject提供的元数据信息不足以创建订阅。这基本上意味着您必须创建自己的元数据模型。让我们举一个例子,它既可以用于单个注册,也可以用于基于约定的注册:
提示:您应该将以下代码片段视为psuedo代码,正如我从内存中编写它们一样。它很可能无法编译
元数据模型
元数据的注册
现在可以像这样在Ninject模块中使用:
Bind<SubscriptionMetadata>()
.ToConstant(new SubscriptionMetadata(typeof(FooConsumer));
基于公约的消费者约束
它还可以通过利用接口与一起使用。如果你愿意,我可以举个例子
Bind<SubscriptionMetadata>()
.ToConstant(new SubscriptionMetadata(typeof(FooConsumer));
public static class SubscriptionBindingExtensions
{
public static void BindConsumer<T>(this IBindingRoot bindingRoot)
where T : IConsumer
{
Bind<SubscriptionMetadata>()
.ToConstant(new SubscriptionMetadata(typeof(T));
}
}
BindConsumer<FooConsumer>();
var kernel = new StandardKernel();
// 2nd Step left out: load all IModule`s ..
var bus = ServiceBusFactory.New(sbc =>
{
//other configuration options
foreach(var metadata in kernel.GetAll<SubscriptionMetadata>())
{
sbc.Subscribe(subs =>
{
subs.Consumer(metadata.ConsumerType, kernel)
});
}
});