quiero inyectar mi contacto para proyectar y usar el contexto en los trabajadores:
public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddDbContext<XContext>(options => { options.UseSqlServer( hostContext.Configuration["ConnectionStrings:Connection"], serverDbContextOptionsBuilder => { var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds; serverDbContextOptionsBuilder.CommandTimeout(minutes); serverDbContextOptionsBuilder.EnableRetryOnFailure(); }); }); //services.AddTransient<XContext>(); //services.AddTransient<XContext>(); services.AddScoped<XContext>(); //workers services.AddHostedService<Worker1>(); services.AddHostedService<Worker2>(); }); }trabajadores:
public class Worker1: BackgroundService { private readonly ILogger<Worker1> _logger; private readonly IConfiguration _configuration; private readonly TookoContext _uow; public Worker1(ILogger<Worker1> logger, IConfiguration configuration, XContext uow) { _logger = logger; _configuration = configuration; _uow = uow; } // ... }pero tengo este error:
Algunos servicios no se pueden construir (Error al validar> el descriptor de servicio ServiceType: Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: Worker1': No se puede consumir el servicio de ámbito 'XContext' de singleton
En su lugar, debe inyectar IServiceProvider en el servicio alojado y luego, cuando necesite un XContext :
using (var scope = _serviceProvider.CreateScope()) { var context = scope.GetRequiredService<XContext>(); // ... } DBContext está destinado a ser de corta duración, así que no caiga en la tentación de crear uno cuando se inicie su servicio y manténgalo durante el tiempo de vida del servicio. En su lugar, debe crearlos, usarlos brevemente y luego desecharlos, cuando sea necesario.
En el ejemplo anterior, el alcance se encargará de desechar el contexto; no es necesario, y no debe, hacerlo usted mismo.