C # - Inizializza DTO in costruttore o tramite proprietà?

3

Mi chiedevo se esiste un approccio raccomandato per inizializzare le proprietà di un oggetto semplice che viene utilizzato per il trasferimento dei dati, ad esempio tramite un'API REST.

Ecco due varianti a cui posso pensare:

public class Dto
{
    public string Name { get; set; }
    public int Number { get; set; }
}

new Dto {
    Name = actualName,
    Number = actualNumber
};


vs


public class Dto
{
    public string Name { get; private set; }
    public int Number { get; private set; }

    public Dto(string name, int number)
    {
        Name = name;
        Number = number;
    }
}

new Dto(actualName, actualNumber);
or
new Dto(name: actualName,
        number: actualNumber);

Vorrei andare per primo, dal momento che è più breve e richiede meno lavoro da mantenere. Tuttavia, le nuove proprietà aggiunte potrebbero essere trascurate da qualcuno che riempie il DTO. Sono anche consapevole del fatto che non rende l'oggetto immutabile, ma dal momento che è solo un DTO, personalmente ritengo che sia meno importante.

    
posta AyCe 07.09.2017 - 07:37
fonte

3 risposte

6

I miei pensieri sono che se il tuo oggetto serve come mezzo per trasferire dati (e quindi puramente output / input in un certo senso), la cosa migliore è non rendere gli oggetti mutabili se non devono essere e che questo sovrascrive la leggibilità quando si tratta di un rigetto in questo modo. La logica è che l'assenza di setter pubblici dice di più su quale sia lo scopo della classe e quindi è più leggibile di quanto la semplice sintassi potrebbe fornire.

In altre parole, la tua classe dovrebbe essere come la tua seconda:

public class Dto
{
    public string Name { get; private set; }
    public int Number { get; private set; }

    public Dto(string name, int number)
    {
        Name = name;
        Number = number;
    }
}

E se siamo sinceri, new Dto(actualName, actualNumber); non è affatto male dal punto di vista della leggibilità.

    
risposta data 07.09.2017 - 08:31
fonte
1

Stai guardando solo una lezione di cemento. Espandi la tua vista aggiungendo un'interfaccia.

Quell'interfaccia ha proprietà di sola lettura, senza alcun setter. Quando un metodo riceve l'istanza ma conosce solo l'interfaccia, non può modificare l'istanza. Ma in quei luoghi in cui viene creata l'istanza, il tipo concreto è noto, quindi i costruttori parametrizzati (che preferisco per chiarezza) o setter pubblici (se richiesto da qualche framework di serializzazione) possono comunque essere utilizzati.

NON aggiungere i setter all'interfaccia, causerebbero mutabilità al di fuori dell'area di creazione dell'istanza.

    
risposta data 11.09.2017 - 09:47
fonte
0

Il tuo DTO deve essere serializzabile per essere utile, e uno dei requisiti per serializzabile è avere un costruttore pubblico predefinito (perché i serializzatori non sanno come chiamare un costruttore che accetta parametri).

Nel tuo costruttore pubblico predefinito dovresti inizializzare le proprietà con i valori predefiniti. Quando si deserializza su un'istanza, le proprietà che non sono presenti nella rappresentazione serializzata avranno questi valori predefiniti.

    
risposta data 07.09.2017 - 08:04
fonte

Leggi altre domande sui tag