Dove iniettare la dipendenza richiesta da tutti gli implementatori di un'interfaccia?

1

Ho un'interfaccia il cui compito è comunicare con il repository (che implementa qualche interfaccia). Non sembra logico implementare questa interfaccia senza ricevere un repository, quindi mi piacerebbe iniettarlo.

Quindi chiedo: dove devo ricevere il repository? Poiché è richiesto in quasi tutte le chiamate di metodi, sembra ragionevole iniettare la dipendenza nel costruttore e non in (praticamente) ogni metodo nell'interfaccia poiché ciò porta a una volontà del principio DRY (non ripeterlo).

D'altro canto, non c'è modo di imporre che ogni implementatore abbia questa dipendenza nel suo costruttore (inoltre - come dovrebbe sapere un implementatore?)

Ho anche pensato di avere una classe astratta invece di un'interfaccia, ma ho presto escluso questa opzione per non limitare l'opzione di derivare un'altra classe.

Cosa dovrei fare in questa situazione, dove dovrei ricevere la dipendenza?

    
posta Belgi 24.01.2016 - 08:32
fonte

2 risposte

2

Le interfacce sono usate per definire un contratto : implementare un'interfaccia è un modo per una classe di indicare che un certo insieme di metodi può essere chiamato su di esso, che questi metodi richiedono argomenti ben definiti e che il risultato del metodo sarà di un certo tipo.

Devi pensare al significato dei metodi sull'interfaccia. Se i metodi sull'interfaccia devono occuparsi esplicitamente del repository, dovresti probabilmente passarlo in ogni metodo che hai. Altrimenti, il fatto che le implementazioni utilizzino un repository non è rilevante per l'interfaccia stessa. È molto difficile definire un'interfaccia e richiedere che gli implementatori lavorino in un certo modo con esso. Questo semplicemente non è ciò che le interfacce fanno . Costringere una classe a lavorare in un certo modo significa derivare la classe da una classe astratta che impone determinati vincoli su di essa.

Una soluzione intermedia sarebbe semplicemente mettere un metodo sull'interfaccia che permetta a una classe che chiama l'interfaccia di assegnargli un repository. È ancora possibile iniettarlo tramite IoC basato sul costruttore (che io raccomanderei), ma si rende anche il fatto che questa interfaccia funzioni esplicitamente su un repository. L'implementazione di tale metodo è un assaggio molto semplice a una variabile locale.

    
risposta data 24.01.2016 - 10:08
fonte
1

Avere sia un'interfaccia che una classe astratta che la implementa in modo tale che solo le implementazioni che devono derivare da qualcos'altro debbano gestire la dipendenza stessa e possono guardare la classe astratta come guida. Documentalo correttamente, naturalmente.

    
risposta data 24.01.2016 - 09:15
fonte

Leggi altre domande sui tag