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.

Reemplace el servicio de EF Core con una instancia en lugar de un tipo.

En un entorno no-ASP.NET (por ejemplo, un programa de consola, pruebas unitarias o la herramienta CLI dotnet ef), puedo reemplazar los servicios de EF Core utilizando DbContextOptionsBuilder:

cs
builder.ReplaceService<IRelationalDatabaseCreator, MyCreator>();
builder.ReplaceService<IMigrationsAssembly, MyAssembly>();

Para MyCreator o MyAssembly, utiliza el tipo y su constructor predeterminado. ¿Cómo puedo reemplazar un servicio con una instancia en su lugar (que puedo personalizar)?

Aquí hay un código (inválido) para mostrar lo que quiero decir:

cs
var myCreator = new MyCreator("foo", 123);
builder.Replace<IRelationalDatabaseCreator>(myCreator);

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar un servicio con una instancia personalizada (en lugar de confiar en su constructor predeterminado), puedes utilizar el método TryAdd de la propiedad IServiceCollection del generador de opciones para agregar tu servicio personalizado antes de llamar a ReplaceService:

    var myCreator = new MyCreator("foo", 123);
    
    // Crea una nueva colección de servicios con los servicios existentes de EF Core
    var services = new ServiceCollection()
        .AddEntityFrameworkSqlServer();
    
    // Agrega tu instancia de servicio personalizado a la colección
    services.AddSingleton<irelationaldatabasecreator>(myCreator);
    
    // Reemplaza el servicio predeterminado con tu servicio personalizado
    builder.ReplaceService<irelationaldatabasecreator>(
        sp => sp.GetService<irelationaldatabasecreator>() ?? myCreator);
    
    // Construye las opciones utilizando la colección de servicios modificada
    var options = new DbContextOptionsBuilder<mycontext>()
        .UseSqlServer(connection)
        .UseInternalServiceProvider(services.BuildServiceProvider())
        .Options;
    

    Este código crea una nueva IServiceCollection con los servicios existentes de EF Core, agrega tu instancia personalizada de IRelationalDatabaseCreator a la colección, y luego reemplaza el servicio predeterminado IRelationalDatabaseCreator con una función de fábrica que devuelve tu instancia personalizada. Finalmente, establece la colección de servicios modificada como el proveedor de servicios internos para el generador de opciones.

Comments are closed.