es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Migración de .NET 5 a .NET 6: Metodología de inicio y configuración en un alojamiento mínimo.

Estoy moviendo mi aplicación Blazor a .NET 6 desde .NET 5 y se recomienda utilizar el nuevo modelo de hospedaje mínimo. Ver Q3 en este documento.

Ok. Entonces, en mi aplicación .net5 tengo una configuración típica de inicio y configuración, pero como parte de eso quiero llamar a mi inicializador de datos que verifica y crea datos de ejemplo si es necesario.

Sí, podría cambiar el enfoque, pero quién sabe si lo necesitaré en otro momento o para otra cosa.

Mi DataInitialiser utiliza UserManager y RoleManager, y los paso como parte del inicio en este momento de la siguiente manera:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
                 UserManager<ApplicationUser> userManager,
                 RoleManager<IdentityRole> roleManager,
                 APDbContext context,
                 APDataInitializer apDataInitializer
                 )
          {
           ...
            some stuff
           ...
            apDataInitializer.SeedData(userManager, roleManager, context);

Había hecho esto antes de haber entendido correctamente cómo funciona el sistema de inyección de dependencias, así que no hay problema, sí, puedo inyectar el usermanager, rolemanager y context en el apDataInitialiser, pero me interesa saber cómo haría esto bajo la nueva configuración… y al menos cómo llamar a apDataInitialiser de todos modos, ya que todavía no se ha inyectado en la aplicación…

He agregado:

// Data Initialiser
builder.Services.AddScoped<APDataInitializer>();

en la sección ‘builder’ del program.cs.

Simplemente no puedo ver cómo llamarlo desde la parte ‘app’.

Se aceptan sugerencias.
Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el nuevo modelo de alojamiento mínimo para .NET 6, puedes utilizar WebApplicationBuilder para construir la aplicación y configurar los servicios. Puedes inyectar tu clase APDataInitializer en la clase de inicio, y luego utilizar IServiceProvider para obtener una instancia de la misma. Aquí tienes un ejemplo:

    public class Startup
    {
        private readonly IServiceProvider _serviceProvider;
    
        public Startup(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public void Configure(IApplicationBuilder app)
        {
            // ... tu configuración de la aplicación
    
            using (var scope = _serviceProvider.CreateScope())
            {
                var dataInitializer = scope.ServiceProvider.GetRequiredService<apdatainitializer>();
                var userManager = scope.ServiceProvider.GetRequiredService<><applicationuser>>();
                var roleManager = scope.ServiceProvider.GetRequiredService<><identityrole>>();
                var context = scope.ServiceProvider.GetRequiredService<apdbcontext>();
                dataInitializer.SeedData(userManager, roleManager, context);
            }
        }
    
        // ... tus otros métodos de inicio
    }
    

    En el ejemplo anterior, estamos inyectando IServiceProvider en el constructor de la clase Startup, y luego lo utilizamos en el método Configure para crear un nuevo ámbito y obtener instancias de los servicios que necesitamos. Finalmente, llamamos al método SeedData en nuestra instancia de APDataInitializer, pasando los servicios como parámetros.

    Ten en cuenta que envolvemos la llamada a GetRequiredService en una instrucción using, lo cual garantiza que cualquier instancia desechable se elimine correctamente una vez que hayamos terminado con ellas.

    ¡Espero que esto te sea de ayuda!

Comments are closed.