Fallo al inyectar un servicio al Consumidor en una aplicación de servicio de Windows (.Net Core 3.1) utilizando MassTransit.
Intento inyectar un ITest al constructor de Consumer en una aplicación de servicio de Windows utilizando MassTransit, pero falla.
Esto es lo que he intentado:
Program.cs
public class Program
{
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
ConfigureServices(services);
}).UseWindowsService();
private static void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<testservice>();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
services.AddTransient<itest, test="">();
}
}
TestService.cs
public class TestService : BackgroundService
{
private IBusControl _bus;
public TestService()
{
}
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
_bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Host("myconnection");
cfg.ReceiveEndpoint("myqueue", endpoint =>
{
endpoint.Consumer<testconsumer>(); //error when build the project
});
});
await _bus.StartAsync();
}
}
TestConsumer.cs
public class TestConsumer : IConsumer<mytestobject>
{
private ITest _test;
public TestConsumer(ITest test)
{
_test = test;
}
public async Task Consume(ConsumeContext<mytestobject> context)
{
}
}
Cuando compilo todo el proyecto, obtengo un error CS0310:
El tipo … debe ser un tipo no abstracto con un constructor público sin parámetros para poder utilizarlo como parámetro …
He buscado y han utilizado services.AddMassTransit
en la función ConfigureServices
. Pero en mi aplicación utilizo un servicio de Windows, no una aplicación de consola.
Entonces, ¿cómo puedo inyectar mi ITest en el constructor de TestService?</itest,>
davy.ai
Para inyectar
ITest
enTestConsumer
usando MassTransit en una aplicación de servicio de Windows, es necesario configurar MassTransit con las interfacesIServiceCollection
eIBusRegistrationContext
. Aquí te mostramos cómo puedes modificar tu código para lograrlo:Program.cs
En
ConfigureServices()
, hemos agregado las siguientes líneas de código:Aquí hemos registrado
ITest
como un servicio con ámbito enIServiceCollection
. También hemos agregado los servicios de MassTransit y la instancia del bus utilizandoIServiceCollection
.En
AddMassTransit()
, especificamos que queremos agregarTestConsumer
al registro de consumidores. También creamos la instancia del bus utilizandoBus.Factory.CreateUsingAzureServiceBus()
y lo configuramos para escuchar en el punto finalmyqueue
.En
AddBus()
, inyectamosIServiceProvider
para que MassTransit pueda resolver la instancia deTestConsumer
e inyectarITest
.En
AddMassTransitHostedService()
, registramos los servicios alojados de MassTransit enIServiceCollection
. Esto iniciará y detendrá el bus como un servicio en segundo plano cuando el servicio de Windows se inicie y se detenga.TestConsumer.cs se mantiene igual:
Con estas modificaciones, ahora deberías poder inyectar
ITest
enTestConsumer
exitosamente.</itest,></itest,>