Passaggio di una dipendenza a una classe controller

1

Sto cercando un approccio al seguente problema:

Ho una libreria riutilizzabile. Contiene una classe controller, nel senso MVC. Diciamo che si chiama UserAdministrationController , ed è per la modifica degli utenti. Questa classe richiede un oggetto che implementa IUserStorage , per la memorizzazione dei suoi dati. La libreria non ha bisogno di conoscere i dettagli di come funziona questo oggetto.

Ora voglio scrivere un'applicazione che include la libreria. In esso, fornirò un'implementazione di IUserStorage . Per creare un'istanza, dovrò passarle alcune dipendenze, come un oggetto di database, e altre cose di cui la mia applicazione conosce solo al runtime.

Ma come potrei quindi passare questo oggetto dalla mia applicazione alla libreria? Non sto creando un'istanza di UserAdministrationController direttamente dalla mia applicazione; viene creato dalla libreria stessa.

Spero che questo abbia un senso. Sto cercando di mantenere la mia descrizione astratta e non specifica per un particolare framework o linguaggio.

    
posta JW01 02.12.2011 - 21:47
fonte

3 risposte

3

Avrai bisogno di aprire la libreria in modo che ci sia un Seam che permetta al consumatore di (ri) definire come vengono create le istanze di UserAdministrationController . Ad esempio, questo potrebbe essere un Fabbrica astratta che i consumatori possono implementare. Ciò non impedisce di fornire un'implementazione predefinita nella libreria, ma consente agli utenti di estendere o modificare il comportamento se necessario.

Qui ci sono maggiori dettagli sulla scrittura di DI frindly libraries: link

(... e nel caso avessi altre risposte che ti dicono che un contenitore DI è la risposta: applicazioni utilizza i contenitori DI; le librerie non dovrebbero assolutamente. Il contenitore DI fa parte dell'infrastruttura di un'applicazione, quindi non dovrebbe essere consentito invadere alcuna libreria È perfettamente possibile eseguire DI senza contenitore, quindi implementando una libreria utilizzando solo i modelli ei principi di DI, si lascia a varie applicazioni se vuoi usare un contenitore, e in tal caso, quale.)

    
risposta data 02.12.2011 - 22:47
fonte
0

La risposta specifica è fondamentalmente specifica per la lingua. La risposta generale è che dovrai esaminare l'iniezione delle dipendenze che gestisce il lavoro delle dipendenze di iniezione (IUserStorage) nel tuo UserAdministrationCntroller.

    
risposta data 02.12.2011 - 21:57
fonte
0

Se la libreria riutilizzabile è una libreria già esistente e costruisce internamente UserAdministrationController , la libreria dovrebbe già disporre di un proprio meccanismo con cui fornisce IUserStorage durante initiallization. Hai solo bisogno di scoprire come lo sta facendo la libreria e usarlo.

Se ti stessi proponendo di scrivere tu stesso la libreria riutilizzabile, ci sarebbe una questione di scegliere le librerie DI o le caratteristiche del linguaggio per fare ciò, ma sembra che la biblioteca sia già stata scritta e tu stia solo cercando di usarla. In tal caso tutte queste decisioni sono già state prese dagli scrittori della biblioteca; hai solo bisogno di scoprire cosa sono e usarli.

    
risposta data 25.05.2014 - 06:45
fonte

Leggi altre domande sui tag