Passare oggetti centrali attorno o avere istanze globali? [duplicare]

3

Avendo un'applicazione WinForms più grande con più classi attualmente faccio riferimento a diversi oggetti "centrali" intorno alle chiamate di funzione.

Questo porta a più parametri del metodo.

Esempio:

public static class Program
{
    private static MyCentral _central;

    ...
}

...

public class SomeController
{
    public object SomeFunction(MyCentral central) 
    {
        // Do something with the MyCentral instance.
    }
}

Ora mi chiedo se dovrei abbandonare questo approccio e utilizzare invece i singleton per quegli oggetti centrali in modo che tutti possano sempre accedere a questi oggetti e non ho più bisogno di passarli in giro.

Esempio:

public static class Program
{
    public static MyCentral Central { get; private set; }

    ...
}

...

public class SomeController
{
    public object SomeFunction() 
    {
        // Do something with the Program.Central singleton.
    }
}

La mia domanda:

Esistono regole di base per scegliere se privilegiare l'approccio singleton o "passing objects around"?

    
posta Uwe Keim 27.06.2014 - 11:35
fonte

2 risposte

5

La regola generale è:

Passa sempre intorno, non utilizzare mai l'approccio tradizionale del modello singleton .

Il tipo di problema si risolve da solo se si utilizza un framework di iniezione delle dipendenze.

L'utilizzo della statica pubblica renderà i test più difficili, accoppierà strongmente i componenti e renderà le dipendenze tra le classi più difficili da vedere.

    
risposta data 27.06.2014 - 11:45
fonte
4

Perché no

public static class Program
{
    private static MyCentral _central;

    ...
    var controller = new SomeController(_central);
}

...

public class SomeController
{
    MyCentral _central;
    public SomeController(MyCentral myCentral)
    {
        _central=myCentral;
    }


    public object SomeFunction() 
    {
        // Do something with _central
    }
}

Si chiama "iniezione costruttore". L'oggetto centrale deve essere passato una sola volta al tuo controller, può essere "deriso" a scopo di test, e se decidi in seguito che devi avere più di un oggetto centrale, non diventerà un problema.

    
risposta data 27.06.2014 - 13:52
fonte

Leggi altre domande sui tag