Tengo una clase que tiene dependencias que he cableado con Ninject.Creación de kernel Ninject dentro de una biblioteca de clases
public interface IFoo {}
public class MyObject {
[Inject]
IFoo myfoo;
}
En la implementación real estoy usando inyección de propiedades, pero solo para ilustrar rápidamente, voy a inyectar en el campo. Según tengo entendido, en lugar de casos de Newing MiObjeto, con el fin de obtener las dependencias que se inyecta correctamente, necesito utilizar
kernel.Get<MyObject>()
Lo que estoy tropezando en la que sin embargo se MiObjeto sólo se utilizará en el contexto de una biblioteca de clase. La intención es que las aplicaciones finales creen sus propios módulos y los pasen a una instancia del kernel para hidratarse. Teniendo en cuenta que, ¿cuál es la forma más pragmática de acercar una instancia genérica de un kernel Ninject a mi biblioteca de clases para que las instancias de MyObject (y otros casos similares) puedan hidratarse?
Mi primera inclinación es una especie de factoría que internaliza un kernel singleton, que las aplicaciones mismas tienen que hidratar/inicializar cargando un módulo.
Así que en RandomService.cs
var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();
Antes de ir demasiado lejos por este camino, sin embargo, tengo que hacer una comprobación de validez para asegurarse de que el pensamiento es el sonido o que no hay alguna otra obvia Lo que me estoy perdiendo. Obviamente soy nuevo en IoC y siento que asimilo lo básico, pero no necesariamente las mejores formas de usarlo en el mundo real.
Afortunadamente, este es un lib interno (en sentido corporativo) así que tengo un público cautivo: otros desarrolladores en mi equipo, utilizando una herramienta estándar. Ahora, cada desarrollador puede tener enlaces diferentes que quieren, de ahí mi quandry original. Re: ctor vs prop injection, prop ciertamente parece tener una gran cantidad de cruft que tengo que escribir, pero me preocupa que la lista de dependencias crezca con el tiempo y por lo tanto las llamadas ctor. ¿Hay otras contras para la inyección de soporte que debería tener en cuenta? – bakasan
Incluso con una aplicación interna, seguiría los mismos principios, ya que conducen a un código más limpio con una mejor separación de las preocupaciones. Hay muchos problemas potenciales con la Inyección de Propiedades, que incluye la protección de invariantes (¿es nula la dependencia?), Posiblemente intercambio en caliente de la dependencia inyectada (probablemente no sea algo que desee hacer) y una API más vaga en general. –
Ah, y para ser directo y explícito al respecto: Considero Service Locator un anti-patrón: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –