Pregunta

Tengo un ASP.NET MVC3 en C# y Razor. La arquitectura de la aplicación se divide en la capa de acceso de datos (Clases EF + Repositorio), capa de servicio, controlador, ViewModels y View.

De mi capa de servicio ProductServices Yo llamo el método GetAllProducts expuesto por mi repositorio ProductRepository , que tiene la siguiente firma:

IQueryable<Products> GetAllProducts()

Por lo tanto dentro de ProductServices Yo lo llamo (productRepository es una instancia de ProductRepository):

var products = productRepository.GetAllProducts(); 

que poca la variable products. Ahora me gustaría acceder al nombre del producto ProductName de productServices. Si uso esta instrucción:

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

Estoy creando acoplamiento entre Servicio de servicio y el EF (omitiendo el repositorio). Eso significa que debo agregar a ProductRepository Un método con firma:

IQueryable<string> GetAllProductsName()

Sin embargo, dado que necesito otra información del producto en mi aplicación, debo crear un método en productRepository para cada campo del Product ¿clase? ¿Es correcto mi razonamiento? Gracias

¿Fue útil?

Solución

Hay dos escuelas de pensamiento en torno a esto,

  1. Un repositorio define explícitamente la forma en que interactúa con la base de datos y debe controlarse estrechamente. Por lo tanto, los métodos en el repositorio deben proporcionar datos enumerados
  2. El repositorio interrumpe el fuerte acoplamiento a un tipo de datos de datos específico, pero no necesita proporcionar conjuntos de datos detallados y enumerados.

Personalmente me suscribo al segundo, aquí hay por qué:

Mi sensación es que cuando te vuelves demasiado explícito dentro del repositorio se convierte en la lógica de negocios en lugar de un mecanismo de desacoplamiento. Realmente no me gusta esto, ya que significa que te vuelves más vinculado a la implementación del repositorio.

También creo que en algunos casos el repositorio no es el lugar correcto para enumerar los datos, por ejemplo, creo que la paginación y la clasificación es una preocupación de la UI, sin embargo, para el rendimiento desea que las consultas solo se relacionen con la página/clasificación actual. Esto significa que debe dejar que la interfaz de usuario contribuya a la compilación de consultas o el repositorio necesita comprender la paginación y la clasificación.

Dicho que proporcionar un data de datos no enumerado lo abre para problemas más adelante en la pista, e incluso si les proporciona, es muy importante enumerar el conjunto lo antes posible.

Si estás interesado, aquí hay mi opinión sobre los repositorios: http://blog.staticvoid.co.nz/2011/10/staticvoid-Repository-Pattern-nuget.html , todo el código también está en GitHub

Otros consejos

Tiene toda la información en sus servicios de productos porque carga toda la información de su repositorio con el método ProductRepository.getallProducts (). Si necesita más información de otra entidad, debe extender sus servicios de productos con un nuevo servicio.

Sin embargo, dado que necesito otra información del producto en mi aplicación, ¿debo crear un método en ProductRepository para cada campo de la clase de producto? ¿Es correcto mi razonamiento? Gracias

En esta situación normalmente creo métodos de extensiones para el servicio y no en el repositorio. El repositorio normalmente tiene una configuración CRUD y nada más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top