当我在默认的ASP.NET Core DI中使用MassTransit v5.1.5时遇到问题。我有以下代码:
var consumers = typeof(CompanyApplicationService).Assembly
.GetTypes()
.Where(t => typeof(IConsumer).IsAssignableFrom(t))
.ToList();
consumers.ForEach(
c => services.AddSingleton(typeof(IConsumer), c));
cqrsConfig.ServiceCollectionConfig = (x) =>
{
consumers.ForEach(consumer => x.AddConsumer<consumer>());
};
因此,我有一个单独的程序集,其中是我的IConsumer<T>
的实现。我已经将这些使用者加载到列表中,但是当我尝试使用MassTransit.ExtensionsDependencyInjectionIntegration.IServiceCollectionConfigurator.AddConsumer<T>()
方法添加它们时,我无法传递以前加载的类型。那么对此有什么想法吗?
我试图像这样注册消费者:
cqrsConfig.InMemoryBusConfig = (c) =>
{
var host = c.Host;
c.ReceiveEndpoint(busName, ep =>
{
ep.LoadFrom(services.BuildServiceProvider());
});
};
但这对我也不起作用。
答案 0 :(得分:0)
这里有不止一件事是错的。
IConsumer
,这显然是错误的。您需要像文档中所述注册您的消费者:
services.AddScoped<OrderConsumer>();
或
services.AddMassTransit(x =>
{
x.AddConsumer<OrderConsumer>();
});
将使用者添加到服务集合后,您还需要按照documentation中所示注册总线,以便使用服务提供商委托:
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host("localhost", "/", h => { });
cfg.ReceiveEndpoint(host, "submit-order", e =>
{
e.LoadFrom(provider);
});
}));
services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());