Dove dovrebbero essere applicate le regole del dominio sull'input dell'utente?

0

L'applicazione è un'API. Gli utenti possono inviare dati all'API, che viene quindi trasformato in un oggetto dominio.

Mi chiedo dove applicare le regole del dominio, nell'oggetto dominio.

Facciamo in modo che sia più chiaro con un esempio del mondo reale:

Gli utenti immettono un calcolo, con Name e CalculationScript . Per facilità d'uso, possono usare parentesi quadre nello script: [3-(5+2)]+9 è valido.

Tuttavia, l'oggetto dominio può contenere solo parentesi standard e le parentesi quadre vengono trasformate.

Mi chiedo se dovrei applicare le regole nel costruttore, o mantenere la conoscenza della stringa grezza e disinfettare nel getter.

Esiste uno schema specifico che è comune utilizzare in questi casi?

Assumendo questo DTO molto semplice:

public class CalcDto{
    public string Name {get;}
    public string CalcScript {get;} 
}

Fatelo nel costruttore:

public class CalcDomain{
    public string Name {get;}
    public string CalcScript {get;}

    public CalcDomain(CalcDto dto){
        this.Name = dto.Name;   
        this.CalcScript = replaceSquareBrackets(dto.CalcScript);
    }
    private string replaceSquareBrackets(string str){
        //...
    }
}

Fallo nel getter

public class CalcDomain{
    public string Name {get;}
    private string RawCalcScript;
    public string CalcScript {get => replaceSquareBrackets(RawCalcScript);}

    public CalcDomain(CalcDto dto){
        this.Name = dto.Name;   
        this.RawCalcScript = replaceSquareBrackets(dto.CalcScript);
    }
    private string replaceSquareBrackets(string str){
        //...
    }
}
    
posta Maxime 17.07.2018 - 14:41
fonte

1 risposta

2

Nel tuo caso specifico, la possibilità di utilizzare diversi tipi di parentesi non è altro che una funzione dell'interfaccia utente per il tuo utente. Come tale, vorrei contenere la funzione multi-parentesi (e il suo metodo di conversione intrinseco) per l'interfaccia utente stessa.

In una soluzione web, farei la conversione in Javascript e far sì che l'applicazione web non sia mai a conoscenza di più parentesi.
In un'applicazione WinForms / WPF, vorrei che Form / Window / Control gestisse la conversione nel suo code-behind.

EDIT avevo perso parte della tua domanda:

Users can post data to the API, which is then transformed to a domain object.

Considererei l'API l'interfaccia dell'utente (dal momento che è il livello con cui comunicano) e quindi eseguono la conversione nell'API. Idealmente, le classi DTO / dominio non contengono mai valori multi parentesi (diversi dal modello di input del controller, se ne hai uno)

Hai posto la domanda sotto un ambito più generale, quindi voglio sottolineare che questo dipende molto dal tipo di convalida che hai e dalle tue priorità.

Esistono due tipi principali di convalida: lato client e lato server.

Note:
For local WinForms/WPF, there is usually little technical difference between frontend and backend since they are one application. The argument here mostly relies on a split front/backend application, where any communication between the two is a non-negligible cost. This can also apply to WinForms/WPF if the application still connects to a remote backend service.

Ci sono tre considerazioni principali: esperienza utente, sicurezza dei dati (= evitare dati non validi) e facilità di sviluppo.

  • La convalida Client ha un'esperienza utente elevata (feedback rapido, nessun ricaricamento della pagina) ma una bassa sicurezza dei dati (i client possono aggirare la convalida locale).
  • La convalida Server-side ha un'elevata sicurezza dei dati ("gatekeeping" del database all'origine) ma un'esperienza utente ridotta (che richiede un postback per confermare la validità dei dati)
  • Lato server E lato client ha il meglio di entrambi i mondi, ma riduce la facilità di sviluppo (dovendo garantire che entrambe le convalide siano sempre aggiornate l'una con l'altra).

Quale sceglierai dipende dalle tue priorità. A volte, non tutte le priorità sono importanti:

  • Quando crei uno strumento per gli sviluppatori, non puoi assumere alcuna responsabilità e quindi non devi preoccuparti degli utenti che aggirano la convalida del client.
  • Vi sono casi di convalida complessa che richiedono l'accesso al database, costringendo quindi a fare affidamento sulla convalida sul lato server.
risposta data 17.07.2018 - 15:03
fonte

Leggi altre domande sui tag