Bastante nuevo en la inyección de dependencia y estoy tratando de averiguar si este es un patrón anti.Inyectando el Inyector de Dependencia usando la Inyección de Dependencia
Digamos que tengo 3 asambleas:
Foo.Shared - this has all the interfaces
Foo.Users - references Foo.Shared
Foo.Payment - references Foo.Shared
Foo.Users necesita un objeto que se construye dentro Foo.Payment y Foo.Payment también necesita cosas de Foo.Users. Esto crea algún tipo de dependencia circular.
He definido una interfaz en Foo.Shared que representa el marco de Inyección de Dependencia que estoy utilizando (en este caso NInject).
public interface IDependencyResolver
{
T Get<T>();
}
En la aplicación contenedora, que tienen una implementación de esta interfaz:
public class DependencyResolver:IDependencyResolver
{
private readonly IKernel _kernel;
public DependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
public T Get<T>()
{
return _kernel.Get<T>();
}
}
La configuración es el siguiente:
public class MyModule:StandardModule
{
public override void Load()
{
Bind<IDependencyResolver>().To<DependencyResolver>().WithArgument("kernel", Kernel);
Bind<Foo.Shared.ISomeType>().To<Foo.Payment.SomeType>(); // <- binding to different assembly
...
}
}
Esto me permite crear una instancia de un nuevo objeto de Foo.Payment.SomeType
desde dentro de Foo.Usuarios sin necesidad de una referencia directa:
public class UserAccounts:IUserAccounts
{
private ISomeType _someType;
public UserAccounts(IDependencyResolver dependencyResolver)
{
_someType = dependencyResolver.Get<ISomeType>(); // <- this essentially creates a new instance of Foo.Payment.SomeType
}
}
Esto hace que no quede claro cuáles son las dependencias exactas de la clase UserAccounts
en esta instancia, lo que me hace pensar que no es una buena práctica.
¿De qué otra forma puedo lograrlo?
¿Alguna idea?
+1 solo para el título de trabalenguas. – womp
mismo aquí, me encanta el título :) –