MassTransit 和 .NET Core DI - 如何使用无参数构造函数解决依赖关系?
MassTransit and .NET Core DI - how to resolve dependencies with parameterless constructor?
我正在使用 .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>();});
我试过了:
// =========== 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);
});
});
应用程序启动,但第一条消息一到达我就收到错误消息:MassTransit.ConsumerException: Unable to resolve consumer type 'AuthService.Integrations.MyAwesomeConsumer'.
如有任何帮助,我将不胜感激。
我希望我问的很清楚。
如果您正在使用 Microsoft.Extensions.DependencyInjection
容器(这是 ASP.NET Core 的默认容器),那么您将需要 MassTransit.Extensions.DependencyInjection
package for MassTransit. Note that the package is currently only available as a pre-release version and also requires a pre-release version of MassTransit. Furthermore, the new package is part of a massive migration for .NET Standard,它仍然不完整,因此您可能应该有点小心,因为在最终版本之前可能会有很多活动部件。
由于该软件包尚未正式发布,因此也没有任何文档。但是从the pull request that introduced it and the current source来看,我认为你需要做的是:
在 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>>();
在配置操作中,您需要注册消费者和 sagas,以便 MassTransit 稍后正确解析它们。
然后,在您的总线配置中,您将调用 LoadFrom
服务提供商:
sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});
至于 where 你应该这样做(也是为了访问服务提供商),我建议你在你的 Startup
' s 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);
}
最后的免责声明:我个人没有使用过 MassTransit,所以我真的不知道这对图书馆是否有意义。
我也遇到了同样的问题,poke 的回答对我不起作用,因为我需要为 IBus
、IPublishEndpoint
和 ISendEndpointProvider
使用 DI。我实际上在一个已删除的答案中找到了解决方案,并对这个问题投了反对票。真的很遗憾,因为它帮助了我。
我找到了这个例子here
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host("localhost", "/", h => { });
cfg.ReceiveEndpoint(host, "web-service-endpoint", e =>
{
e.Consumer<DoSomethingConsumer>(provider);
});
}));
我正在使用 .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>();});
我试过了:
// =========== 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);
});
});
应用程序启动,但第一条消息一到达我就收到错误消息:MassTransit.ConsumerException: Unable to resolve consumer type 'AuthService.Integrations.MyAwesomeConsumer'.
如有任何帮助,我将不胜感激。 我希望我问的很清楚。
如果您正在使用 Microsoft.Extensions.DependencyInjection
容器(这是 ASP.NET Core 的默认容器),那么您将需要 MassTransit.Extensions.DependencyInjection
package for MassTransit. Note that the package is currently only available as a pre-release version and also requires a pre-release version of MassTransit. Furthermore, the new package is part of a massive migration for .NET Standard,它仍然不完整,因此您可能应该有点小心,因为在最终版本之前可能会有很多活动部件。
由于该软件包尚未正式发布,因此也没有任何文档。但是从the pull request that introduced it and the current source来看,我认为你需要做的是:
在 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>>();
在配置操作中,您需要注册消费者和 sagas,以便 MassTransit 稍后正确解析它们。
然后,在您的总线配置中,您将调用 LoadFrom
服务提供商:
sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>
{
e.LoadFrom(serviceProvider);
});
至于 where 你应该这样做(也是为了访问服务提供商),我建议你在你的 Startup
' s 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);
}
最后的免责声明:我个人没有使用过 MassTransit,所以我真的不知道这对图书馆是否有意义。
我也遇到了同样的问题,poke 的回答对我不起作用,因为我需要为 IBus
、IPublishEndpoint
和 ISendEndpointProvider
使用 DI。我实际上在一个已删除的答案中找到了解决方案,并对这个问题投了反对票。真的很遗憾,因为它帮助了我。
我找到了这个例子here
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host("localhost", "/", h => { });
cfg.ReceiveEndpoint(host, "web-service-endpoint", e =>
{
e.Consumer<DoSomethingConsumer>(provider);
});
}));