Esiste uno schema per le operazioni non CRUD rispetto a un database?

3

Nella mia piccola applicazione C #, gestisco le query SQL direttamente dal codice utilizzando ADO.NET di base. Non voglio utilizzare un ORM, come Entity Framework.

Ora, ho un repository per le operazioni CRUD. Ma trovo che ho bisogno di flessibilità per query più complesse.

Ad esempio, ecco il processo (ingenuo e semplificato) di accesso all'applicazione:

  1. L'utente digita una password (nessun nome utente, stile Windows).
  2. A Count SQL-query conta gli utenti con tali credenziali.
  3. Se esiste un utente con tali credenziali, un repository di utenti carica le informazioni dell'utente dal database e recupera un oggetto User .

Ora, dove dovrebbe essere il metodo Count ? Certamente non può essere nel repository, quindi dove dovrebbe essere? Esiste un modello per la gestione di tali operazioni non CRUD rispetto al database?

    
posta Sipo 27.09.2017 - 20:58
fonte

2 risposte

9

It certainly can't be in the repository

Certo che può. Questo potrebbe effettivamente essere il posto migliore per questo. La responsabilità del repository è di fornire un'astrazione per un sottoinsieme del database, che potrebbe essere sostituito da un deposito fittizio a scopo di test. Mettere qualcosa come un metodo Count in un repository si adatterà ancora a quel "modello". Nota che se il codice client del repository non ha bisogno di usare direttamente SQL, questo rende il codice client molto più semplice per il test dell'unità (senza un database).

Naturalmente, se ottieni una dozzina di questi metodi di query, potrebbe diventare necessario suddividere ulteriormente la classe di pronti contro termine in classi separate, ma come e quando lo fai dipende da te, non c'è un carico cerebrale -programma di progettazione per questo.

    
risposta data 28.09.2017 - 06:48
fonte
3

In genere ciò è stato fatto tramite:

  • ExecuteReader - Restituisce 1 o più record di dati = > %codice%
  • ExecuteScalar - Restituisce un singolo valore = > %codice%
  • ExecuteNonQuery - Non restituisce nulla = > %codice%

Si può anche avere un valore di ritorno da una procedura memorizzata e anche un riferimento a parametri che possono essere controllati.

Il tuo livello dati dovrebbe supportare queste operazioni. (ADO.Net sì)

    
risposta data 27.09.2017 - 21:12
fonte

Leggi altre domande sui tag