Come crei oggetti immutabili con molti parametri?

1

Ho bisogno di creare un oggetto immutabile ma richiede diversi parametri per lavorare come:

class FooRepo
{
    public string ConnectionStringName { get; }
    public string SchemaName { get; }
    public string TableName { get; }
    public Dictionary<string, int> ColumnLengths { get; }
    public Dictionary<Type, SqlDbType> TypeMappings { get; }

    // some queries...
    public IEnumerable<string> GetStrings(object param1) { ... }
}

Trovo che ci siano troppi parametri per passarli tutti tramite il costruttore (potrei aggiungere più tardi).

Anche l'idea di bloccare l'oggetto dopo che è stata impostata non sembra buona.

Ho pensato di creare un FooBuilder , ma questo nasconderebbe solo un costruttore enorme .

L'unica soluzione ragionevole che riesco a pensare è quella di definire i valori predefiniti per alcune proprietà come ColumnLengths e TypeMappings e consentire all'utente di sovrascriverli / personalizzarli derivando dalla classe originale.

Che cosa diresti? O forse ci sono modi migliori per un simile compito?

    
posta t3chb0t 25.06.2016 - 21:31
fonte

3 risposte

2

Supponendo che la tua classe non sia "troppo grande" (che dovresti controllare prima), invece di avere un enorme elenco degli argomenti del costruttore in FooRepo , puoi passare i valori utilizzando un mutabile Oggetto DTO come una forma di "oggetto helper". Questa potrebbe essere una classe FooRepoDTO , oppure quando segui il modello di build , potrebbe essere lo stesso FooRepoBuilder ( che deve fornire accesso a tutti i dati trasmessi dai metodi "Set ...".

    
risposta data 25.06.2016 - 22:31
fonte
9

Li passi attraverso il costruttore. Se questo significa che il tuo costruttore è troppo grande, allora forse la tua classe gigante non dovrebbe essere così gigante.

Ci sono pochissime cose al mondo che hanno 5+ elementi indipendenti ma coesi.

    
risposta data 25.06.2016 - 21:55
fonte
1

OK, penso di averlo capito ma è un po 'diverso dal modello di build originale . Se il builder è annidato all'interno dell'oggetto immutabile, può quindi accedere alle sue proprietà e impostarle anche se rimangono private dell'oggetto reale:

class Foo
{
    public Foo() {} 

    public string Bar { get; private set; }

    public string Qux { get; }

    public class Builder
    {
        private Foo _foo = new Foo();
        private Builder() {}

        public static Builder Create() 
        {
            return new Builder();
        }

        public Builder Bar(string bar) 
        {
            _foo.Bar = bar;
            return this;
        }

        public Foo ToFoo()
        {
            return new Foo() 
            {
                Bar = _foo.Bar
            };
        }
    }
}

Utilizzo:

var foo = Foo.Builder.Create().Bar("baz").ToFoo();
var bar = foo.Bar;
    
risposta data 26.06.2016 - 00:17
fonte

Leggi altre domande sui tag