Domanda

Ho un ASP.NET MVC3 in C# e Razor. L'architettura dell'applicazione è divisa nel livello di accesso ai dati (Classi EF + repository), livello di servizio, controller, ViewModels e View.

Dal mio livello di servizio ProductServices Chiamo il metodo GetAllProducts esposto dal mio repository ProductRepository , che ha la seguente firma:

IQueryable<Products> GetAllProducts()

Pertanto all'interno ProductServices Chiamo (productRepository è un'istanza di ProductRepository):

var products = productRepository.GetAllProducts(); 

che popola la variabile products. Ora vorrei accedere al nome del prodotto ProductName da productServices. Se uso questa istruzione:

var productNames = products.Select(m => m.ProductName).ToList();

Sto creando un accoppiamento tra Servicelayer e il Ef (bypassing del repository). Ciò significa che devo aggiungere a ProductRepository Un metodo con la firma:

IQueryable<string> GetAllProductsName()

Tuttavia, poiché ho bisogno di altre informazioni sul prodotto nella mia applicazione, devo creare un metodo in productRepository per ogni campo del Product classe? Il mio ragionamento è corretto? Grazie

È stato utile?

Soluzione

Ci sono due scuole di pensiero intorno a questo,

  1. Un repository definisce esplicitamente il modo in cui si interagisce con il database e dovrebbe essere strettamente controllato. Pertanto i metodi sul repository dovrebbero fornire dati enumerati
  2. Il repository rompe l'accoppiamento forte a un tipo di dati specifico ma non è necessario fornire set di dati dettagliati ed elencati.

Personalmente mi iscrivo al secondo, ecco perché:

La mia sensazione è che quando diventi eccessivamente esplicito all'interno del repository si trasforma in logica aziendale piuttosto che in un meccanismo di disaccoppiamento. Non mi piace molto perché significa che diventi più strettamente legato all'implementazione del repository.

Penso anche che in alcuni casi il repository non sia il posto giusto per elencare i dati, ad esempio credo che il paging e l'ordinamento siano una preoccupazione dell'interfaccia utente, tuttavia per le prestazioni si desidera che le query si riferiscano solo alla pagina/ordinamento corrente. Ciò significa che è necessario lasciare che l'interfaccia utente contribuisca alla compilation di query o il repository deve comprendere il paging e l'ordinamento.

Detto questo, fornire dati di dati nonumerati ti aprirà per problemi in seguito e anche se si fornisce loro è molto importante elencare il set il prima possibile.

Se sei interessato ecco la mia opinione sui repository: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html , tutto il codice è anche su GitHub

Altri suggerimenti

Hai tutte le informazioni nei tuoi prodotti Product Services perché caricano tutte le informazioni dal tuo repository con il metodo ProductRepository.GetAllProducts (). Se hai bisogno di maggiori informazioni da un'altra entità, è necessario estendere i tuoi servizi a un nuovo servizio.

Tuttavia, poiché ho bisogno di altre informazioni sul prodotto nella mia applicazione, devo creare un metodo in ProductRepository per ogni campo della classe di prodotti? Il mio ragionamento è corretto? Grazie

In questa situazione normalmente creo il metodo di estensione per il servizio e non nel repository. Il repository ha normalmente una configurazione CRUD e niente di più.

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