Estoy acostumbrado a IoC/DI en aplicaciones web, principalmente Ninject con MVC3. Mi controlador está creado para mí, rellenado con todas las dependencias en su lugar, subdependencias, etc.La forma correcta de realizar la inyección de dependencias en un cliente de Windows (WPF) Aplicación
Sin embargo, las cosas son diferentes en una aplicación cliente gruesa. Tengo que crear mis propios objetos, o tengo que volver a un enfoque de estilo de localizador de servicios donde pido al kernel (probablemente a través de alguna interfaz, para permitir la capacidad de prueba) que me proporcione un objeto completo con dependencias.
Sin embargo, he visto varios lugares que el Localizador de servicios ha sido descrito como un antipatrón.
Así que mi pregunta es: si quiero beneficiarme de Ninject en mi aplicación cliente grueso, ¿hay una forma mejor/más adecuada para obtener todo esto?
- Comprobabilidad
- DI apropiado/IOC
- La menor cantidad de acoplamiento posible
Tenga en cuenta que no estoy hablando sólo de MVVM y trasladarse en modelos de vista en las vistas. Esto se desencadena específicamente por la necesidad de proporcionar un objeto tipo repositorio desde el kernel, y luego las entidades recuperadas de ese repositorio reciben funcionalidad (los datos provienen de la base de datos, pero también necesitan algunos objetos como parámetros dependiendo del estado del mundo, y Ninject sabe cómo proporcionar eso). ¿De alguna manera puedo hacer esto sin dejar a los repositorios y entidades como un desastre incontrastable?
Si algo no está claro, házmelo saber. ¡Gracias!
EDICIÓN DE JULIO DE decimocuarto
estoy seguro de que las dos respuestas proporcionadas son probablemente correcta. Sin embargo, cada fibra de mi cuerpo está luchando contra este cambio; Parte de esto probablemente se deba a una falta de conocimiento, pero también hay una razón concreta por la que tengo problemas para ver la elegancia de esta forma de hacer las cosas;
No expliqué esto lo suficientemente bien en la pregunta original, pero el hecho es que estoy escribiendo una biblioteca que será utilizada por varias (4-5 al principio, quizás más adelante) aplicaciones de cliente de WPF. Todas estas aplicaciones operan en el mismo modelo de dominio, etc., por lo que mantenerlo todo en una sola biblioteca es la única manera de mantenerse SECO. Sin embargo, también existe la posibilidad de que los clientes de este sistema escriban sus propios clientes, y quiero que tengan una biblioteca simple y limpia para hablar. No quiero obligarlos a usar DI en su Composition Root (usando el término como Mark Seeman en su libro), porque eso dificulta enormemente las cosas en comparación con ellos simplemente al actualizar MyCrazySystemAdapter() y usar eso.
Ahora, el MyCrazySystemAdapter (nombre elegido porque sé que la gente no estará de acuerdo conmigo aquí) debe estar compuesto por subcomponentes, y ensamblado mediante DI. MyCrazySystemAdapter en sí no debería necesitar ser inyectado. Es la única interfaz que los clientes deben usar para hablar con el sistema. Entonces, un cliente felizmente debería obtener uno de esos, DI sucede como magia detrás de escena, y el objeto está compuesto por muchos objetos diferentes utilizando las mejores prácticas y principios.
Me doy cuenta de que esta va a ser una forma controvertida de querer hacer cosas. Sin embargo, también conozco a las personas que van a ser clientes de esta API.Si ven que necesitan aprender y cablear un sistema DI, y crear su estructura de objetos completa antes de tiempo en su punto de entrada de la aplicación (Composition Root), en lugar de reactivar un solo objeto, me darán el dedo medio y meterse en la base de datos directamente y arruinar las cosas de una forma difícil de imaginar.
TL; DR: La entrega de una API correctamente estructurada es demasiada molestia para el cliente. Mi API necesita entregar un solo objeto, construido detrás de escena usando DI y prácticas adecuadas, que puedan usar. El mundo real algunas veces supera el deseo de construir todo al revés para mantenerse fiel a los patrones y las prácticas.
-1 Your 'GetStuff()' es un localizador de servicio en un vestido. No hagas esto (No hay nada de malo con el resto de su respuesta, pero el SLness lo hace iremanente) –
Ruben, tienes razón. ¡Corregí mi respuesta! –
Incluso antes de ver la respuesta de Remo (que creo que es el enfoque correcto), iba a sugerir la inyección de fábricas (como Funcs en su caso a la http://stackoverflow.com/questions/4840157/does-ninject-support- func-auto-generated-factory/4851885 # 4851885) –