Dapper e validazione degli oggetti / applicazione delle regole aziendali

4

Questo in realtà non è specifico di Dapper, in quanto si riferisce a qualsiasi oggetto serializzabile XML .. ma si è verificato quando stavo memorizzando un oggetto usando Dapper.

In ogni caso, diciamo che ho una classe utente. Normalmente, farei qualcosa del genere:

class User
{
    public string SIN {get; private set;}
    public string DisplayName {get;set;}

    public User(string sin)
    {
        if (string.IsNullOrWhiteSpace(sin))
            throw new ArgumentException("SIN must be specified");
        this.SIN = sin;
    }
}

Dato che è richiesto un SIN, vorrei solo creare un costruttore con un parametro sin, e renderlo di sola lettura.

Tuttavia, con un Dapper (e probabilmente qualsiasi altro ORM), ho bisogno di fornire un costruttore senza parametri e rendere tutte le proprietà scrivibili. Quindi ora ho questo:

class User: IValidatableObject 
{
    public int Id { get; set; }
    public string SIN { get; set; }
    public string DisplayName { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
      // implementation
    }
}

Questo sembra .. non può davvero scegliere la parola, un cattivo odore?
A) Sto permettendo di cambiare le proprietà che non dovrebbero essere cambiate mai dopo che un oggetto è stato creato (SIN, userid)

B) Ora devo implementare IValidatableObject o qualcosa di simile per testare tali proprietà prima di aggiornarle in db.

Quindi come si fa a riguardo?

    
posta Evgeni 13.04.2012 - 16:34
fonte

1 risposta

2

In generale, il tuo database assegnerà l'ID a un'operazione di inserimento, non tu. Se non si fornisce l'ID per un'operazione di lettura, modifica o eliminazione, l'operazione semplicemente non funzionerà. In altre parole, il database sta eseguendo la convalida sull'ID, non sulla tua classe DTO.

Spesso, le classi DTO sono popolate da alcuni processi automatizzati, leggendo da un database, vincolando a un modulo Web o deserializzando. Tutti i campi sono popolati contemporaneamente. Non c'è modo di dire, prima del tempo, se l'ID verrà popolato correttamente. Ecco perché la convalida viene eseguita dopo il fatto.

    
risposta data 13.04.2012 - 17:35
fonte

Leggi altre domande sui tag