C # modo migliore / più pulito per fare singleton?

1

Sto lavorando su un piccolo progetto e ho deciso di passare da DI a modello singolo. Anche se conosco 2 modi per fare singleton.

Il primo è dove ogni classe non modello è un singleton. Questo significa:

UserController
DatabaseHelper
ConfigurationModule
FriendComponent

Sono tutti singleton, tuttavia:

User
UserFriendship
DatabaseConnection
DatabaseConfig

Non sono da quando sono tutti modelli.

Tuttavia, il secondo modo che conosco è:

Ho una classe singleton principale (userò il programma di classe come esempio). La classe ha un aspetto simile a:

class Program
{
    private static Program _instance;
    private readonly DatabaseHelper _databaseHelper;

    public Program()
    {
        _databaseHelper = new DatabaseHelper();
    }

    public static Program GetInstance()
    {
        if (_instance == null) 
        {
            _instance = new Program();
        }

        return _instance;
    }
}

So che questo è principalmente soggettivo, ma mi stavo chiedendo quale di questi 2 (o se entrambi) non sia il migliore da usare.

    
posta Navine 10.07.2018 - 09:36
fonte

2 risposte

11

I know this is mainly subjective but I was wondering which of these 2 (or if both not) is best to use.

Nessuno dei due. Non ci sono scuse, mai, per infliggere l'anti-pattern singleton su un pezzo di codice.

Se è necessario Program per essere un singleton, quindi crearlo una volta e passarlo intorno all'applicazione tramite parametri costruttore e metodo. Dopotutto, tutta quell'iniezione di dipendenza è quando viene ridotta alla sua forma pura. Se hai problemi con DI allora le probabilità sono: ti sei tuffato prima a usare un framework DI e hai finito per legarti con la sua complessità. Quindi inizia dall'inizio: passa i valori intorno usando i parametri.

Il modello singleton è solo una variabile globale glorificata, con tutte le azione a problemi di distanza che i globals causa. Rende il codice difficile da mantenere e molto difficile da testare. Quindi non li uso, per favore.

    
risposta data 10.07.2018 - 09:48
fonte
2

Considera questo:

Se un singleton è la soluzione, allora qual è il problema?

Ma voglio solo un'istanza di una classe!

Bene, quindi crea una singola istanza.

Ma perché dipingersi in un angolo con un singleton quando non c'è il rialzo? Considera l'esempio canonico di registrazione. Potresti volere un solo registro ora, ma potresti volerne un numero in futuro.

Lungi dal rendere il codice più semplice, i singleton tendono ad avere una propria sintassi specifica nel codice (e anche nei framework). C'è un persistente degrado delle basi di codice (in particolare quelle legacy) e sospetto che la storia giudicherà giustamente queste "pallottole d'argento" come un errore.

    
risposta data 10.07.2018 - 12:45
fonte

Leggi altre domande sui tag