Dove posizionare la convalida POCO - Architettura N-layer

1

Sto sviluppando un'app n-layer. Uno dei livelli è BusinessLayer e utilizza un set di POCO definito in CoreLayer . Inoltre ho PresentationLayer (WinForms)

CoreLayer

  • POCO (classi con proprietà)
  • Interfacce del repository (usa i POCO come tipi di parametri) Ad esempio:

    public interfaces ICarRepository
    {
     IEnumerable<CarPOCO> GetAllCars();
    }
    
    public class CarPOCO
    {
      public int Id{get;set;}
      public string Name{get;set;}
    }
    

DataAccessLayer

  • Implementazione personalizzata di IRepositories. Ad esempio con accesso ai dati SQLServer.

PresentationLayer

  • Contiene tutti i WinForm per recuperare le informazioni = > generare POCO e idealmente voglio convalidare l'input dell'utente. Questi POCO sono archiviati in DB

BusinessLayer :

  • Logica degli autobus
  • Voglio mettere la convalida dei dati POCO qui, ma non sono sicuro se sia il posto giusto, o come affrontarlo poiché sono definiti in CoreLayer.

Domande

A . Dove posso inserire la convalida?

B . In quale livello? E come (progettazione) posso arricchire i POCO definiti in CoreLayer con quelle validazioni? (Suppongo che la convalida si adatti meglio in businesslayer poiché rappresentano le regole aziendali)

C . Puoi mostrarmi un modello di progettazione / alcune linee guida di progettazione per includere tali valdifiche?

Grazie mille, mi stai facendo risparmiare.

    
posta Badulake 30.05.2018 - 11:19
fonte

2 risposte

4

A. Where can I place the validation?

Indipendentemente dal tuo design, ci sono due posti in cui va il codice di validazione:

  1. Vicino all'input
  2. Vicino a

Metti la validazione vicino a input in modo che tu possa mostrare all'utente l'errore velocemente e ottenere una correzione tempestiva. Inoltre, per comprendere bene il contesto degli utenti.

Metti in pratica la validazione per proteggersi dalle molte cose selvagge e meravigliose che possono cambiare i dati da quando è stato convalidato per la prima volta.

In alcuni progetti questi due posti sono lo stesso posto. Questo può andare bene fino a quando l'applicazione non cresce.

Comprendi che la convalida è richiesta solo quando il sistema di tipi non è abbastanza specifico per le tue esigenze. Se un metodo può utilizzare qualsiasi int allora non è necessaria alcuna convalida oltre il sistema di tipi. Se un metodo può utilizzare qualsiasi int non negativo, allora è necessaria la convalida se la tua lingua non ha int unsigned.

B. In which layer?And how(design) can I enrich the POCOs defined in CoreLayer with that validatons ?(I guess validation fits better in businesslayer since they represent business rules)

Non tutta la convalida è una regola aziendale. A volte è una regola per le applicazioni. Ad esempio se l'azienda non si cura se l'ID auto è negativo ma l'applicazione lo fa, forse a causa del DB, quindi non è l'azienda che ha creato questa regola. Va bene. È ancora importante convalidare. Ma non è una regola aziendale.

PresentationLayer

Contains all the WinForms to retrieve information=> generating POCOs and ideally I want to validate the user input. These POCOs are latter stored in DB

Sembra che il livello di presentazione generi l'auto. Potremmo far rispettare le regole dell'ID qui semplicemente non creando mai un ID negativo o zero. Tuttavia, poiché Id ha un setter pubblico, tutto ciò che tocca Car può rovinarlo. Se lo hai cambiato in privato, passando a utilizzare un costruttore per impostare l'ID sarebbe immutabile e non dovremmo mai più controllarlo. Se lo facessi, potresti mettere la validazione nella classe Car stessa. Diventa parte del tipo di auto. Se non lo fai, dovrai controllarlo nuovamente prima di inserirlo nel DB.

Il Name potrebbe avere una vera regola aziendale come "nessuna parolaccia". Questo è probabilmente l'utente inserito. Vorresti informare l'utente del problema sullo stesso schermo in cui hanno inserito la parolaccia. Anche in questo caso, è possibile passare all'utilizzo di un costruttore per impostare un nome immutabile e tutti gli oggetti di tipo Car avrebbero nomi senza parole. Altrimenti vorrai assicurarti di ricontrollarlo prima di usarlo per assicurarti che qualcos'altro non lo abbia incasinato.

Il livello di presentazione dovrà gestire i fallimenti di validazione se solo per recuperare da essi. Probabilmente dicendo all'utente "non funzionerà perché

risposta data 30.05.2018 - 16:05
fonte
0

How can I add [my validation functionality] splitted in two layers for the same class, in a well-designed way?

In C #, hai alcune scelte. Puoi:

  1. Crea una classe parziale per contenere le convalide. Questo è utile se i tuoi POCOS vengono generati dal codice.

  2. Crea una nuova classe contenente le convalide e associa il POCO alla nuova classe nell'altro livello.

  3. Utilizza un framework di convalida.

Personalmente, aggiungerei solo una proprietà IsValid al tuo POCO.

    
risposta data 31.05.2018 - 17:29
fonte

Leggi altre domande sui tag