Un contenitore IoC viola il principio Aperto / Chiuso?

1

In questo momento costruisco manualmente tutti gli oggetti della mia applicazione nella classe radice. Poiché ora sta diventando brutto, voglio passare a un IoC-Container come Autofac. Ora devo registrare manualmente ogni interfaccia con la relativa implementazione. Sembra fantastico, funziona alla grande, ma:

Dire che devo modificare uno dei costruttori delle mie classi. Devo aggiungere un'altra dipendenza. Ora devo ricordare di tornare alla mia root e registrare quell'interfaccia / implementazione. Questo non viola il principio Aperto / Chiuso?

    
posta selmaohneh 12.10.2018 - 10:55
fonte

2 risposte

3

Say I have to modify one of my classes' constructor...

A mio parere, questo è il punto in cui stai violando il principio Open / Closed (O / C). Se si modifica un costruttore, quella classe non è più chiusa alla modifica. Anche con l'approccio DI attuale puro / povero, dovresti modificare un altro codice per adattarlo al cambiamento. Il fatto che tu stia considerando di utilizzare un contenitore IoC invece non lo cambierebbe, anche se l'utilizzo di un contenitore rischia di non essere rilevato in fase di compilazione, solo quando l'app viene eseguita, ma questo è un rischio minimo.

Poiché il codice è tutto contenuto in una singola app, il principio O / C non è particolarmente importante qui. Funziona davvero solo se si modifica l'API pubblica di una libreria o di un modulo da cui dipendono molte app o altre librerie. Quindi devi riflettere attentamente su tali cambiamenti, e ad esempio utilizzare il controllo delle versioni semantico per evidenziare i cambiamenti di rottura dovuti alla necessità di modificare una classe chiusa.

    
risposta data 12.10.2018 - 11:15
fonte
0

No, i contenitori e i costruttori IoC non violano il Principio Aperto / Chiuso.

Se devi aggiungere una nuova dipendenza alla tua classe, il modo Open / Closed per farlo sarebbe creare una nuova classe che erediti da quella vecchia e che abbia un nuovo costruttore con la nuova dipendenza, sovrascrivendo i metodi dove richiesto.

Se la tua classe orgional è "aperta" per l'estensione, questo dovrebbe essere possibile.

Il tuo contenitore IoC nella tua app, nel frattempo, non richiede alcuna estensione della sua funzionalità per registrare la nuova classe piuttosto che la vecchia. Quindi il principio di Open Closed non si applica affatto

La tua app stessa presumibilmente può tranquillamente consumare la nuova classe come una sottoclasse dell'originale e iniettata tramite IoC, quindi ancora una volta il principio non si applica.

Se si scopre che non si è in grado di creare una sottoclasse della classe originale e aggiungere la dipendenza e le funzionalità richieste e che è necessario modificarne il codice per far funzionare quella funzionalità extra. Quindi la tua classe originale ha fallito il test aperto / chiuso.

Tuttavia, in questi giorni immagino che tutti stiano usando le interfacce anziché le classi base. Così eviti molti di questi problemi.

Modifica. re: per quanto riguarda la classe radice nell'app?

Tecnicamente hai la stessa opzione con la classe principale della tua app, ovvero sotto classe e modifica la registrazione interna. Solo perché stai utilizzando un contenitore IoC, ciò non significa che non puoi ignorare la tua funzione di configurazione, rimuovere e aggiungere registrazioni o rendere la tua classe aperta all'estensione in altri modi.

Ma a questo livello non avrebbe senso farlo. A meno che l'app non sia un plug-in o altro, nessun altro codice lo consumerà, non c'è alcun svantaggio nel cambiare semplicemente il codice nella classe radice.

    
risposta data 12.10.2018 - 12:00
fonte

Leggi altre domande sui tag