2009-12-02 12 views
6

Cosa dovrei fare attenzione quando si costruisce una libreria di classi abbastanza complessa da utilizzare l'iniezione di dipendenza interna?Quali sono le migliori pratiche per le librerie di classi che utilizzano l'integrazione delle dipendenze per le operazioni interne?

Supponendo che utilizzerà Castle Windsor (ad esempio), quale sarebbe il miglior luogo/metodo per configurare il contenitore, dato che la libreria verrà utilizzata da una semplice applicazione di console (senza DI), moduli Web che utilizzano lo stesso contenitore (Castle Windsor) e le app Web che utilizzano un contenitore diverso (NInject)?

risposta

6

Vorrei utilizzare the facade pattern qui: nella libreria, esporre un metodo pubblico su una classe pubblica che esegue l'inizializzazione del contenitore (come ad esempio un semplice Initialize()) e utilizzare Castle Windsor solo internamente all'interno della libreria, in modo che i client della libreria non so nemmeno che lo stai usando.

+5

+1 Considerati i requisiti stabiliti nell'OP, il modello di facciata si presenta come un buon adattamento. Tuttavia, mi chiedevo se la decisione di nascondere un DI Container come dettaglio di implementazione fosse saggia, ma suppongo che dipenda ... –

+0

È un buon inizio, grazie. Inoltre, potrei anche usare Initialize() per passare i valori di configurazione runtime richiesti contenuti in un oggetto da Castle DictionaryAdapter o qualcosa di simile, a seconda dell'applicazione chiamante. – alexandrul

+0

BTW, invece di un metodo 'Initialize()', raccomando vivamente un metodo Factory o simile http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling –

2

Non che la risposta non funzionerebbe, ma penso che chiunque torni qui dovrebbe dare un'occhiata a this Q/A. Dopo aver letto su di esso DEVO concordare che using an IoC within a class library smells like a ServiceLocator (anti-pattern) e che Coupling a library to a container is a smell.

Inizialmente ho pensato che avrei fatto una buona cosa, la cosa migliore che ho fatto è stato cercare prima.

Problemi correlati