Come estendere l'iniezione del costruttore?

4

Supponiamo che abbia MyClass con una dipendenza molto semplice. Utilizza l'iniezione del costruttore.

public class MyClass : IMyClass
{
    private IA A;

    public MyClass(IA a)
    {
        A = a;
    }
}

Questo codice viene spedito e alcuni altri sviluppatori lo stanno usando.
Ad un certo punto in futuro ho bisogno di aggiungere una seconda dipendenza, su IB.

Come dovrei aggiungere questa dipendenza a IB?

Alcune opzioni e perché non lo approvo:

  • Basta aggiungerlo al costruttore
    • Cambio di frenatura.
  • Ereditarietà o il modello decoratore.
    • Classi extra e code bloat.
    • La nuova classe avrà il codice di codice che passa attorno alla IA.
    • Non ho alcuna garanzia che altri sviluppatori passeranno all'utilizzo della nuova classe.
  • Utilizzare un localizzatore di servizi per compilare il nuovo campo IB.
    • Ora sto usando due diversi tipi di iniezione per ulteriore confusione.

Mi sembra che l'iniezione del costruttore non sia facilmente estensibile.

    
posta Swesus 08.05.2014 - 14:11
fonte

2 risposte

3
  1. Crea un'implementazione di IB che contenga il comportamento che MyClass attualmente possiede che viene estratto, oppure se IB fornisce una nuova funzionalità, quindi un'implementazione predefinita sensibile che conserva la semantica corrente di MyClass .
  2. Aggiungi la dipendenza da IB a MyClass tramite un nuovo costruttore.
  3. Chiedi al vecchio costruttore di creare un'istanza dell'implementazione di IB eseguita in passaggio 1 .

Il vecchio codice funziona ancora, il nuovo codice può fornire un comportamento alternativo come desiderato.

    
risposta data 08.05.2014 - 14:27
fonte
1

Se MyClass ha bisogno di avere un IB per funzionare, allora non c'è davvero una scelta. Qualsiasi modifica senza interruzione si tradurrebbe solo in bug perché gli altri continueranno a usare MyClass senza fornire l'oggetto IB richiesto, quindi puoi anche evitarlo e rendere la nuova dipendenza un parametro obbligatorio del tuo costruttore.

Se la dipendenza su IB è facoltativa , allora hai alcune opzioni:

  • Ricava un nuovo MyClass_version2 da MyClass e fornisci tutto il nuovo comportamento basato su IB da lì. Probabilmente funzionerà meglio se c'è una piccola sovrapposizione tra il comportamento esistente e le estensioni.
  • Aggiungi la nuova dipendenza IB a MyClass , ma assicurati di impostarla su null nel costruttore esistente e assicurati che tutti i metodi possano gestire un IB nullo. Quindi aggiungi un overload del costruttore MyClass(IA a, IB b) .
risposta data 08.05.2014 - 15:22
fonte

Leggi altre domande sui tag