2009-05-16 15 views
7

Qualcuno ha collegamenti o consigli su come collegare la convalida che richiede l'interazione con il database prima dell'aggiornamento o dell'aggiunta al database? Ogni esempio che vedo mostra come convalidare le proprietà, ad es. "È richiesto", "È email", "È numerico", ecc., Ma come si fa a convalidare la convalida per "Impossibile ordinare articoli esauriti"? This xVal blog post tocca su di esso ma non fornisce un esempio.convalida interazione database mpg asp.net

Ho seguito il tutorial di NerdDinner che utilizza un repository, ma questo è il bit che non riesco a ottenere ... Diciamo che avevamo un OrderController con un metodo Create e prima di creare un ordine dovevamo prima controlla che l'articolo sia disponibile. Nello stile NerdDinner, il controller utilizza il repository per comunicare con il database, quindi in che modo il nostro oggetto Order (modello) sarà in grado di applicare questa convalida insieme alla convalida della proprietà, poiché non può parlare al database?

Grazie per qualsiasi aiuto

risposta

0

vorrei creare un OrderService con un metodo PlaceOrder (ordine ordine). OrderService utilizza il repository per eseguire operazioni CRUD e imporre regole aziendali (controllo delle scorte) e alla fine lanciare un'eccezione sulla violazione delle regole che è possibile rilevare e segnalare all'utente.

+0

Speravo di mantenere questo nel contesto su NerdDinner e non utilizzare i servizi al momento. Vorrei mantenere le cose il più semplici possibile per capire come è tutto collegato. grazie – atwrok8

3

Nel tutorial NerdDinner, è possibile eseguire il checkout di IsVaild e quindi dei metodi GetRuleViolation. In base alle regole aziendali e del database, è possibile utilizzarle per verificare i dati che si hanno prima di inserirli. È anche possibile creare un metodo IsValidForInsert per verificare le regole specifiche dell'inserto che è necessario applicare.

In NerdDinner, GetRuleViolation consente di recuperare le regole violate e farle esplodere all'interfaccia come preferisci.

public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 


     if (CheckDbForViolation) 
      yield return new RuleViolation("Database Violation", "SomeField"); 

     if (String.IsNullOrEmpty(Title)) 
      yield return new RuleViolation("Title is required", "Title"); 

     if (String.IsNullOrEmpty(Description)) 
      yield return new RuleViolation("Description is required", "Description"); 

     if (String.IsNullOrEmpty(HostedBy)) 
      yield return new RuleViolation("HostedBy is required", "HostedBy"); 

... etc ... 


     yield break; 
    } 

    public bool CheckDbForViolation() 

    { 

    /// Do your database work here... 

    } 

È possibile utilizzare ulteriormente questo codice e suddividere il codice nel repository. CheckDbForViolation chiamerebbe il repository per le informazioni e quindi determinerà se c'è stata una violazione o meno. Infatti se si sta utilizzando un repository, penso che sarebbe il modo preferibile per farlo.

+0

Ho letto su IsValid e GetRuleViolations ma non si fa menzione dello scenario "Impossibile ordinare l'articolo esaurito". Dove si posizionerebbe questo tipo di regola aziendale? grazie – atwrok8

+0

Uno dei tuoi passaggi di convalida sarebbe quello di uscire e interrogare il database per vedere se l'articolo è in magazzino. Quindi continuare se si è bravi o falliti e si impedisce che la scrittura del database avvenga. –

+0

Capisco qual è il passo della validazione, ma dove dovrebbe andare la logica? Il controllore utilizza il repository, quindi per interrogare il database questa logica dovrebbe essere nel controller, tuttavia, sono consapevole che le regole aziendali dovrebbero rimanere nel modello? Sto iniziando a pensare che il controller non debba usare il repository ?! grazie – atwrok8

1

Non hai davvero bisogno di alcuna guida da esempi su come farlo. Alla fine dovrai essere in grado di creare tali applicazioni da solo, il che significa essere creativi.

Ho deciso fin dall'inizio di non utilizzare la convalida incorporata o l'API di appartenenza per non incorrere nei suoi limiti in un determinato momento.

Per la vostra situazione: è praticamente standard.

immaginare il flusso di esecuzione come segue:

  1. modulo di inserimento
  2. formato di dati in ingresso Convalida senza parlare con il database di
  3. Se (2) è passata, quindi convalidare l'input dal punto di regole aziendali/integrità dei dati. Qui si parla al database
  4. Se (3) è passato, eseguire l'operazione qualunque esso sia. Se in qualche modo fallisce (forse le regole di integrità dei dati nel database proibiscono l'operazione, ad esempio, hai eliminato un oggetto correlato dall'altra finestra del browser), quindi annulla e notifica all'utente un errore di operazione.

Cercare di mantenere i metodi del controllore più vuoti possibili. La logica di validazione e funzionamento dovrebbe risiedere nei modelli e nella logica aziendale.Il controller dovrebbe tentare fondamentalmente l'operazione prevista e in base allo stato restituito basta restituire una vista o l'altra. Forse un paio di altre opzioni, ma non l'intero carico di controlli per i ruoli degli utenti, i diritti di accesso, la chiamata di alcuni servizi web, ecc. Mantienilo semplice.

P.S. A volte ho l'impressione che le funzionalità integrate destinate a semplificare le cose semplici per la maggior parte degli sviluppatori tendano a creare nuove barriere su quelle rimosse.

+0

Il flusso di esecuzione che hai elencato è esattamente quello che farei, non sono sicuro dei termini dell'esempio di NerdDinner, in cui verrebbe inserita la convalida. Avrebbe più senso per me se l'oggetto Ordine usasse il Repository e quindi il Controller parlasse unicamente dell'oggetto Order. In questo modo l'oggetto dell'Ordine per gestire entrambe le forme di validazione può ora dialogare con il database, sarebbe un'opzione migliore secondo te? grazie – atwrok8

+0

Non sono così familiare con l'esempio di NerdDinner. Se "Repository" rappresenta una sorta di livello database, mentre c'è un livello intermedio di business logic (il tuo ordine, ad esempio, può essere considerato un oggetto business), è chiaramente sbagliato per un controller utilizzare il repository direttamente per qualsiasi scopo. La comunicazione deve essere: [Controller] <-> BLL <-> DAL. A volte usi solo modelli anziché BLL, ma non è esattamente giusto. I modelli sono lì solo per imballare i dati per una visualizzazione da visualizzare. – User