7

Quando si scrive codice che dovrebbe essere in grado di identificare due grandi gruppi di oggetti:Dependency Injection, iniettando un oggetto "iniettabile" (servizio) in un newable (entità)

  • iniettabili
  • newables

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

  • oggetti iniettabili sono oggetti (servizi) che espongono le dipendenze nei loro costruttori queste dipendenze sono solitamente risolti utilizzando un contenitore CIO, questi oggetti possono chiedere solo per altri iniettabili nei loro costruttori

  • newable sono oggetti che espongono anche dipendenze nel loro costruttori ma newables possono solo chiedere per altri oggetti newable (Enti, oggetti di valore), un'altra caratteristica degli oggetti newable è che non dovrebbero contenere un riferimento a un oggetto iniettabile

Ma quando la scrittura di codice, spesso bisogno di "iniettare" un serv ghiaccio (iniettabile) in un'entità (novità)

Ho pensato che forse esporre una dipendenza di servizio in un oggetto nuovo è meglio farlo a livello di metodo, ma sembra molto lavoro da fare .... solo pensando a risolvere le dipendenze ogni volta che un metodo viene chiamato .... beh questo puzza avremmo dovuto utilizzare il Servizio Locator anti-modello

il modo in cui ho risolto questo è:

  • Creare un'interfaccia con un metodo che espone la dipendenza (il servizio verrà utilizzato in questo metodo)

  • Creare un metodo di estensione per l'interfaccia e collocarlo in uno spazio dei nomi diverso, forse in un altro assembly, e basta avvolgere la chiamata al metodo originale per risolvere la dipendenza utilizzando un localizzatore di servizio

Facendo questo abbiamo avere una separazione coerente tra oggetti nuovi e iniettabili con la possibilità di utilizzare i servizi nei nostri newables facilmente

  • Cosa ne pensi?
  • L'utilizzo del localizzatore di servizio in un metodo di estensione è considerato una cattiva pratica?
  • Come testare l'unità la chiamata al metodo di estensione?
+1

Strettamente correlato: http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven

+0

Thx questo collegamento è stato davvero utile – Jupaol

risposta

2

Ma quando la scrittura di codice, spesso abbiamo bisogno di "iniettare" un servizio (iniettabile) in un'entità (newable)

questo non è il caso- se si trova la necessità di fai questo poi c'è qualche funzionalità che esiste nell'entità che dovrebbe essere in un servizio.

Diciamo che il vostro nuovo è ShoppingCart e il vostro iniettabile è un database repository. Vuoi essere in grado di farlo:

// somehow cart already got the repository 
cart.save(); 

Beh, lo stai facendo male. Invece è necessario cambiare le cose e fare:

respository.save(cart); 

Se si potrebbe fornire una situazione di quando si sente il bisogno di fare questo, potremmo discutere specifiche di quella situazione.