Posso usare DI con il cliente del pattern Abstract Factory c #

-2

Diciamo che ho qualcosa del genere:

switch(i)  
{  
       case 1: new Class1();break;  
       case 2: new Class2();break;
}

Quindi quali sono le migliori pratiche per farlo se nella classe in cui l'ho inserito utilizza attivamente l'iniezione del costruttore DI. È ragionevole iniettare tutte le Class1 e Class2 se finisce con una sola implementazione?

    
posta MrTKer 24.04.2018 - 22:44
fonte

1 risposta

2

La tua domanda non è chiara in quanto non è ovvio che cosa succede con quegli oggetti Class1 e Class2 . Ma supponendo che vengano usati, condividono un'interfaccia? Altrimenti, stai rendendo la vita dura per DI.

Quello a cui dovresti mirare è una fabbrica che implementa essa stessa un'interfaccia. Quindi si inserisce un'istanza di tale interfaccia di fabbrica nel costruttore. A sua volta, la factory avrà un metodo che restituisce un'istanza dell'interfaccia che Class1 e Class2 implementano.

L'istruzione switch si trova quindi in un'implementazione concreta dell'interfaccia factory.

Modifica

Alla luce di voi, commentate che viene usata un'interfaccia condivisa, come funzionerebbe secondo le seguenti linee. Supponiamo che tu abbia attualmente la classe Foo :

class Foo
{
    void Bar(int i)
    {
        switch(i)  
        {   
            case 1: DoSomethingWith(new Class1());break;  
            case 2: DoSomethingWith(new Class2());break;
        }
    }

    private void DoSomethingWith(ISomeThing x) ...
}

Quindi usando DI, questo potrebbe diventare qualcosa del tipo:

class Foo
{
    private readonly ISomethingFactory _factory;

    public Foo(ISomeThingFactory factory) => _factory = factory;

    void Bar(int i) => DoSomethingWith(_factory.CreateObject(i));

    private void DoSomethingWith(ISomeThing x) ...
}

interface ISomethingFactory 
{
    ISomeThing CreateObject(int i);
}

class ConcreteFactory : ISomethingFactory
{
    public ISomeThing CreateObject(int i)
    {
        switch(i)  
        {   
            case 1: return new Class1();  
            case 2: return new Class2();
        }
    }
}

...
var myFoo = new Foo(new ConcreteFactory());
    
risposta data 24.04.2018 - 23:18
fonte

Leggi altre domande sui tag