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.

Inyección de Dependencias Integrada (.NET Core DI): ¿Cómo puedo evitar instanciar dependencias manualmente?

Actualmente estoy utilizando la Inyección de Dependencias (DI) incorporada en .NET Core.

Mi aplicación utiliza el Patrón de Diseño de Motor de Reglas.

Una de mis reglas tiene una dependencia que a su vez tiene una dependencia. Así que tengo que seguir creando nuevas instancias de las dependencias. Siento que debe haber una mejor manera.

Aquí tienes un ejemplo de mi código.

Esto funciona, pero no me gusta tener que crear nuevas instancias de DataService y Repository.

“`c#
var rules = new List<irule>
{
new Rule1(),
new Rule2(new DataService(new Repository(CnnStr))) // Esto es lo que no me gusta
};
s.AddTransient<irulesengine>(sp => new RulesEngine(rules));

<pre><code><br />Comencé a configurar esto:

“`c#
s.AddTransient<irepository>(sp => new Repository(CnnStr));
s.AddTransient<idataservice>(sp => sp.GetRequiredService<dataservice>());

Esto parece acercarme un poco a lo que quiero. Pero no tengo idea de cómo llenar la lista de reglas con una lista de instancias de las reglas sin tener que crear las dependencias (DataService y Repo).

Algo así, pero sé que este código no es correcto.

c#
var rules = new List<irule>
{
s.AddTransient<irule>(sp => sp.GetRequiredService<rule1>()),
s.AddTransient<irule>(sp => sp.GetRequiredService<rule2>())
};
s.AddTransient<irulesengine>(sp => new RulesEngine(rules));

Agradecería cualquier ayuda.

Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como ya has comenzado a configurar las dependencias utilizando DI, estás en el camino correcto. Para evitar tener que crear manualmente las dependencias en el constructor de Rule2, debes usar DI para inyectarlas en su lugar.

    Para hacer eso, puedes modificar el constructor de Rule2 para que acepte la interfaz IDataService en lugar de la clase concreta DataService. Luego, al registrar Rule2 en el contenedor de DI, puedes usar el ServiceProvider para resolver la interfaz IDataService, que se resolverá automáticamente a la clase registrada DataService.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para usar DI en Rule2:

    // Registrar las dependencias
    services.AddTransient<irepository>(sp => new Repository(CnnStr));
    services.AddTransient<idataservice, dataservice="">();
    
    // Registrar las reglas
    services.AddTransient<irule, rule1="">();
    services.AddTransient<irule, rule2="">();
    
    // Crear una lista de reglas
    var rules = serviceProvider.GetServices<irule>().ToList();
    
    // Crear el motor de reglas con la lista de reglas
    services.AddTransient<irulesengine>(sp => new RulesEngine(rules));
    

    Con este código, el constructor de Rule2 se verá así:

    public Rule2(IDataService dataService)
    {
        // Utilizar la instancia de IDataService inyectada
        _dataService = dataService;
    }
    

    Y IDataService se resolverá automáticamente a DataService cuando se instancie Rule2 mediante el contenedor DI.

    Espero que esto te ayude. Avísame si tienes alguna pregunta adicional.</irule,></irule,></idataservice,>

Comments are closed.