Domanda

Sto lavorando a un progetto usando ASP.NET MVC e il modello di repository. Ho classi di repository e servizi che consumano queste classi di repository. La mia domanda è: è corretto restituire un IQueryable dalla mia classe di repository e quindi utilizzare " .Where " e " .OrderBy " in un servizio per generare un elenco? Se sì, è la migliore pratica?

Grazie!

È stato utile?

Soluzione

Per cominciare: non c'è " giusto " o "errato" Qui. È solo una questione di ciò che funziona meglio per te e per il sistema che stai costruendo. Ad esempio, Rob Conery ha realizzato un'applicazione di esempio ASP.NET chiamata Storefront con esattamente lo schema che stai descrivendo e ha innescato una grande guerra di fiamma. Gran parte della discussione si è evoluta attorno al modello di Repository che è considerato quello "originale" come descritto da Eric Evans nel suo libro Domain Driven Design e che descrive l'interfaccia di un repository come uno che accetta e / o restituisce istanze effettive (di elenchi di istanze) e non un'interfaccia di query.

Tanto per la teoria. Cosa scegliere per il tuo sistema? Il motivo per cui non sceglierei direttamente il percorso IQueryable è che in realtà perde un po 'della mia strategia di persistenza al livello client (essendo il livello di servizio in questo caso). Dal momento che ha senso restituire un IQueryable se si recuperano oggetti dal database usando LINQ in [un metodo di accesso al database (come SQL, Entities, ...)]. Solo allora .Where o .OrderBy ottimizzeranno il risultato della query. Ovviamente non ha senso se stai usando un codice di accesso al database che ottiene un elenco completo che poi esponi dal Repository usando LINQ to Objects. Quindi in breve: leghi il tuo livello client alla strategia di accesso al database basata su LINQ che stai utilizzando.

Essendo anch'io un po 'purista, preferirei non far emergere questo legame con LINQ dal mio repository e sceglierei di offrire criteri di dove e di ordine attraverso i parametri delle operazioni del repository. Posso eseguire tutta l'ottimizzazione del recupero nel repository e restituire un set pulito pulito di oggetti di dominio.

Quindi alla fine si riduce a: tutto ciò che funziona meglio per te va bene.

Altri suggerimenti

Non vedo perché questo sarebbe un problema. Se diventerai più specifico nei dati che recupererai nel tuo livello di servizio, ciò significa che verranno trasferiti meno dati tra l'applicazione e il database, il che significa una maggiore efficienza. In questo modo, implementerai anche il caricamento lento o otterrai i dati quando ne avrai assolutamente bisogno. Considerando l'apolidia del web, questa è una buona cosa. Non vuoi recuperare tutti i dati nel caso in cui potresti utilizzarli.

In altre parole, non ha senso ottenere l'intero elenco di utenti, selezionare semplicemente quello che si chiama " Jackolantern. "

Il modo migliore di pensarci è così: se domani decidi di passare da MSSQL a MySQL, dovrai replicare la logica aziendale? In tal caso, stai utilizzando il tuo repository in modo errato.

Sì, sono abbastanza soddisfatto del repository che restituisce IQueryable, ma con un avvertimento: alcune funzioni di Linq non sono disponibili per tutti i provider. Ad esempio, i metodi Single / SingleOrDefault non sono disponibili in Linq to Entities. Quindi il tuo livello di servizio potrebbe dover passare attraverso alcuni cerchi a seconda dell'implementazione concreta del tuo repository.

Di solito inserisco l'interfaccia delle classi di repository nel livello di dominio e le implementazioni effettive nel livello di servizio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top