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.
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 interfazIDataService
en lugar de la clase concretaDataService
. Luego, al registrarRule2
en el contenedor de DI, puedes usar elServiceProvider
para resolver la interfazIDataService
, que se resolverá automáticamente a la clase registradaDataService
.Aquí tienes un ejemplo de cómo puedes modificar tu código para usar DI en
Rule2
:Con este código, el constructor de
Rule2
se verá así:Y
IDataService
se resolverá automáticamente aDataService
cuando se instancieRule2
mediante el contenedor DI.Espero que esto te ayude. Avísame si tienes alguna pregunta adicional.</irule,></irule,></idataservice,>