M U*_*M U 8 c# masstransit .net-core asp.net-core
我正在使用.NET Core 2和MassTransit 4(dev)开发应用程序.
Mass Transit要求消费者使用无参数构造函数.我需要在我的消费者中使用例如logger,dbContext等,我想继续使用.NET Core中的原生DI,所以我不想添加Autofac等(如果可能的话?).当.NET Core DI无法注入我的deps时会导致问题,因为我的使用者是使用无参数构造函数创建的...
是否有任何方法可以使用本机网络核心DI解决依赖关系,同时具有无参数构造函数或者是否有某种方式来声明MassTransit的端点,这将允许执行标准之外的其他操作:
sbc.ReceiveEndpoint(host, Configuration["QueueName"],
e => { e.Consumer<MyAwesomeConsumer>();});
Run Code Online (Sandbox Code Playgroud)
我试过了:
// =========== MASS TRANSIT ===============
var serviceProvider = services.BuildServiceProvider();
services.AddSingleton<MyAwesomeConsumer, MyAwesomeConsumer>();
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
sbc.ReceiveEndpoint(host, Configuration["QueueName"],
e =>
{
e.Consumer(typeof(MyAwesomeConsumer), serviceProvider.GetService);
});
});
Run Code Online (Sandbox Code Playgroud)
应用程序提升,但是一旦第一条消息到达,我就会收到错误: MassTransit.ConsumerException: Unable to resolve consumer type 'AuthService.Integrations.MyAwesomeConsumer'.
我将不胜感激任何帮助.我希望我明白我要问的是什么.
pok*_*oke 15
如果您正在使用Microsoft.Extensions.DependencyInjection
容器(这是ASP.NET Core的默认容器),那么您将需要MassTransit.Extensions.DependencyInjection
MassTransit 的包.请注意,该软件包目前仅作为预发布版本提供,还需要预发布版本的MassTransit.此外,新的软件包是.NET Standard的大规模迁移的一部分,但仍然不完整,因此您可能会有点小心,因为在最终版本发布之前可能会有相当多的移动部件.
由于该软件包尚未正式发布,因此还没有任何文档.但是从查看引入它的拉取请求和当前源代码来看,我认为您需要做的是以下内容:
在Startup.ConfigureServices
,您需要添加MassTransit,就像添加其他服务一样:
services.AddMassTransit(c =>
{
c.AddConsumer<MyConsumer>();
c.AddConsumer<MyOtherConsumer>();
// or sagas
c.AddSaga<MySaga>();
});
// you still need to register the consumers/sagas
services.AddScoped<MyConsumer>();
services.AddScoped<MyOtherConsumer>();
services.AddSingleton<ISagaRepository<MySaga>, InMemorySagaRepository<MySaga>>();
Run Code Online (Sandbox Code Playgroud)
在配置操作中,您需要注册消费者和传奇,以便MassTransit稍后正确解决它们.
然后,在您的总线配置中,您将LoadFrom
与服务提供商联系:
sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});
Run Code Online (Sandbox Code Playgroud)
至于你应该在哪里这样做(也是为了能够访问服务提供商),我建议你用你Startup
的Configure
方法来做.该方法可以将任何依赖作为参数,因此您可以轻松地在那里注入服务提供者:
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IApplicationLifetime applicationLifetime)
{
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});
});
// start/stop the bus with the web application
applicationLifetime.ApplicationStarted.Register(bus.Start);
applicationLifetime.ApplicationStopped.Register(bus.Stop);
}
Run Code Online (Sandbox Code Playgroud)
最后一个免责声明:我个人没有使用过MassTransit,所以我真的不知道这是否对图书馆有实际意义.
我也遇到了同样的问题,poke 的回答对我不起作用,因为我需要将 DI 用于IBus
,IPublishEndpoint
和ISendEndpointProvider
. 我实际上在一个已删除的答案中找到了解决方案,对这个问题投了反对票。真的很惭愧,因为它帮助了我。
我在这里找到了这个例子
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host("localhost", "/", h => { });
cfg.ReceiveEndpoint(host, "web-service-endpoint", e =>
{
e.Consumer<DoSomethingConsumer>(provider);
});
}));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5870 次 |
最近记录: |