Saltar al contenido

MassTransit y .NET Core DI: ¿cómo resolver las dependencias con un constructor sin parámetros?

No olvides que en las ciencias informáticas un problema casi siempere suele tener diferentes resoluciones, pero nosotros mostraremos lo mejor y más eficiente.

Solución:

Si está utilizando el Microsoft.Extensions.DependencyInjection contenedor (que es el predeterminado con ASP.NET Core), necesitará el MassTransit.Extensions.DependencyInjection paquete para MassTransit. Tenga en cuenta que el paquete actualmente solo está disponible como una versión preliminar y también requiere una versión preliminar de MassTransit. Además, el nuevo paquete es parte de una migración masiva para .NET Standard, que aún no está completa, por lo que probablemente debería tener un poco de cuidado, ya que es probable que haya bastantes partes móviles hasta el lanzamiento final.

Dado que el paquete no se lanzó oficialmente, tampoco hay documentación sobre él todavía. Pero al mirar la solicitud de extracción que lo introdujo y la fuente actual, creo que lo que debe hacer es lo siguiente:

En Startup.ConfigureServices, debe agregar MassTransit, al igual que agregaría otros servicios:

services.AddMassTransit(c =>

    c.AddConsumer();
    c.AddConsumer();

    // or sagas
    c.AddSaga();
);

// you still need to register the consumers/sagas
services.AddScoped();
services.AddScoped();
services.AddSingleton, InMemorySagaRepository>();

En la acción de configuración, debe registrar sus consumidores y sagas para que MassTransit los resuelva correctamente más adelante.

Luego, en su configuración de bus, llamaría LoadFrom con el proveedor de servicios:

sbc.ReceiveEndpoint(host, Configuration["QueueName"], e =>

    e.LoadFrom(serviceProvider);
);

Como para donde debe hacer esto (también para tener acceso al proveedor de servicios), le sugiero que lo haga en su Startup‘s Configure método. El método puede tomar cualquier dependencia como argumento, por lo que puede insertar fácilmente el proveedor de servicios allí:

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);

Sin embargo, un descargo de responsabilidad final: personalmente no he usado MassTransit, por lo que realmente no sé si esto tiene sentido para la biblioteca.

También tuve el mismo problema y la respuesta de poke no funcionó para mí, ya que necesitaba usar DI para IBus, IPublishEndpoint y ISendEndpointProvider. De hecho, encontré la solución en una respuesta eliminada con un voto negativo sobre esta misma pregunta. Lástima realmente, ya que me ayudó.

Encontré este ejemplo aquí

services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>

   var host = cfg.Host("localhost", "/", h =>  );

   cfg.ReceiveEndpoint(host, "web-service-endpoint", e =>
   
      e.Consumer(provider);
   );
));

Te mostramos las comentarios y valoraciones de los lectores

Si sostienes alguna suspicacia o disposición de limar nuestro reseña eres capaz de añadir una apostilla y con placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *