2008-10-01 9 views
5

Soy un poco novato DI, así que perdónenme si este es el enfoque equivocado o una pregunta tonta.¿Cómo debo solicitar mis parámetros de ctor para DI/IOC?

Digamos que tengo un formulario que crea/actualiza un pedido, y sé que tendrá que recuperar una lista de productos y clientes para mostrar. Quiero pasar el objeto Order que está editando, pero también quiero inyectar ProductsService y CustomersService como dependencias.

Por lo tanto, querré que mi contenedor IoC (el que yo elija) suministre los servicios, pero corresponderá al código de llamada proporcionar el objeto Order para editar.

¿Debo declarar el constructor como tomar el objeto orden que el primer parámetro y el comercialesServicios y CustomersService después de eso, por ejemplo:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... o de que las dependencias llegado primero y el objeto Order pasado, por ejemplo:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

¿Importa? ¿Depende de qué contenedor de IoC utilizo? ¿O hay un mejor camino?

Respuesta

4

No estoy de acuerdo con la respuesta de @ aku.

Creo que lo que estás haciendo está bien y también hay otras maneras de hacerlo que no están más o menos bien. Por ejemplo, uno puede preguntarse si este objeto debería estar dependiendo de los servicios en primer lugar.

Independientemente de DI, creo que es útil aclarar en su mente al menos el tipo de estado que tiene cada objeto, como el estado real (orden), el estado derivado (si lo hay) y las dependencias (servicios):

http://tech.puredanger.com/2007/09/18/spelunking/

en cualquier constructor o método, prefiero los datos reales que se deben pasar primero y dependencias o material externo al ser pasados ​​pasado. Entonces, en tu ejemplo, preferiría el primero.

5

Matt, no debe mezclar los parámetros normales con las dependencias. Dado que su objeto se creará en el interior del contenedor IoC, ¿cómo va a especificar los argumentos necesarios?

La dependencia de la mezcla y los argumentos normales complicarán la lógica de su programa.

En este caso, sería mejor declarar propiedades de dependencia (es decir, eliminar las dependencias de constructor) o inicializar campo de orden después IoC construido OrderForm y resolvió sus dependencias (es decir, eliminar de los parámetros normales de constructor).

También puede declarar todos sus parámetros, incluyendo como como dependencias.

+0

Ok, esto tiene sentido. Entonces, ¿utilizo la inyección de propiedades para todas mis dependencias, o SÓLO transfiero dependencias al controlador e introduzco una propiedad para el objeto "necesario"? –

+0

Sí, tienes razón. No mezcle DP y las propiedades normales porque puede ocasionar problemas imprevistos y limitar el rango de marcos de IoC adecuados. – aku

3

Me siento un poco incómodo al permitir que se instancia una instancia de OrderForm sin la referencia requerida a una instancia de pedido. Una razón podría ser que esto me impediría hacer una verificación inicial de pedidos nulos. ¿Alguna idea adicional?

Supongo que podría consolarme al saber que los objetos OrderForm solo se crearán una instancia mediante un método Factory que asegure que la propiedad Order se establezca después de realizar la llamada al framework IoC.

+0

En mi respuesta, propuse varios enfoques, incluido uno con el parámetro ** order ** obligatorio. Sin embargo, las preguntas se referían a la mezcla de DP y propiedades normales. Mi respuesta es - no mezclar. Me gustaría escuchar críticas constructivas. – aku

Cuestiones relacionadas