Domanda

Sono un po 'un principiante DI, quindi perdonami se questo è l'approccio sbagliato o una domanda sciocca.

Supponiamo di avere un modulo che crea / aggiorna un ordine e so che sarà necessario recuperare un elenco di prodotti e clienti da visualizzare. Voglio passare l'oggetto Order che sta modificando, ma voglio anche iniettare ProductsService e CustomersService come dipendenze.

Quindi voglio che il mio contenitore IoC (qualunque vada con) fornisca i servizi, ma spetterà al codice chiamante fornire l'oggetto Order da modificare.

Devo dichiarare che il costruttore ha preso l'oggetto Ordine come primo parametro e successivamente il ProductService e il Servizio Clienti, ad esempio:

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

... o se le dipendenze dovessero venire per prime e l'oggetto Order per ultimo, ad esempio:

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

Importa? Dipende dal contenitore IoC che utilizzo? Oppure c'è un "migliore" modo?

È stato utile?

Soluzione

Non sono d'accordo con la risposta di @ aku.

Penso che quello che stai facendo vada bene e ci sono anche altri modi per farlo che non sono più o meno giusti. Ad esempio, ci si potrebbe chiedere se questo oggetto debba dipendere in primo luogo dai servizi.

Indipendentemente da DI, ritengo sia utile chiarire nella tua mente almeno il tipo di stato che ogni oggetto detiene, come lo stato reale (Ordine), lo stato derivato (se presente) e le dipendenze (servizi):

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

Su qualsiasi costruttore o metodo, preferisco che i dati reali vengano passati per primi e che le dipendenze o le cose esterne vengano passate per ultime. Quindi nel tuo esempio preferirei il primo.

Altri suggerimenti

Matt, non dovresti mescolare i parametri normali con le dipendenze. Dato che il tuo oggetto verrà creato all'interno del contenitore IoC, come hai intenzione di specificare gli argomenti necessari?

Mischiare dipendenza e argomenti normali renderà la logica del tuo programma più complicata.

In questo caso sarebbe meglio dichiarare le proprietà delle dipendenze (cioè rimuovere le dipendenze dal costruttore) o inizializzare il campo ordina dopo che IoC ha costruito OrderForm e risolto le sue dipendenze (cioè rimuovi parametri normali dal costruttore).

Inoltre puoi dichiarare tutti i tuoi parametri, incluso ordine come dipendenze.

Mi sento un po 'a disagio nel consentire un'istanza di un'istanza di OrderForm senza il riferimento richiesto a un'istanza di Order. Un motivo potrebbe essere che ciò mi impedirebbe di effettuare il controllo iniziale per gli ordini nulli. Qualche altro pensiero?

Suppongo che potrei confortarmi nel sapere che gli oggetti OrderForm verranno istanziati solo da un metodo Factory che garantisce che la proprietà Order sia impostata dopo aver effettuato la chiamata al framework IoC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top