Saltar al contenido

Uso de Factory Pattern con ASP.NET Core Dependency Injection

Nuestro grupo de expertos pasados varios días de investigación y de recopilar de información, dimos con la respuesta, queremos que resulte de gran utilidad para tu trabajo.

Solución:

Use la sobrecarga del delegado de fábrica al registrar el repositorio

//...

var mode = "get value from config";

services.AddScoped(sp =>         
    var repo = sp.GetRequiredService();
    var apiKey = repo.GetApiKeyMethodHere();

    return new GlobalRepository(mode, apiKey);
);

//...

Es posible que desee comprobar también estos enlaces…

https://github.com/Microsoft/AspNetCoreInjection.TypedFactories

https://espressocoder.com/2018/10/08/inyectando-un-servicio-de-fabrica-en-asp-net-core/

Con respecto al último enlace, el código es básicamente:

public class Factory : IFactory

    private readonly Func _initFunc;

    public Factory(Func initFunc)
    
        _initFunc = initFunc;
    

    public T Create()
    
        return _initFunc();
    


public static class ServiceCollectionExtensions

    public static void AddFactory(this IServiceCollection services) 
    where TService : class
    where TImplementation : class, TService
    
        services.AddTransient();
        services.AddSingleton>(x => () => x.GetService());
        services.AddSingleton, Factory>();
    

Creo que las fábricas tipificadas de Castle Windsor se deshacen de todo lo que crearon cuando se desechan (lo que puede no ser siempre la mejor idea), con estos enlaces probablemente tendrías que considerar si todavía esperas ese comportamiento. Cuando reconsideré por qué quería una fábrica, terminé simplemente creando una nueva envoltura de fábrica simple, como:

public class DefaultFooFactory: IFooFactory
  public IFoo create()return new DefaultFoo();

Si sostienes alguna sospecha y capacidad de acrecentar nuestro escrito puedes ejecutar un exégesis y con deseo lo observaremos.

¡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 *