Question

J'ai un ASP.NET MVC3 en C # et rasoir. L'architecture de l'application est divisée en couche d'accès aux données (des classes EF + dépôt), la couche de service, contrôleur, ViewModels et Voir.

De mon couche de service ProductServices j'appelle la méthode GetAllProducts exposée par mon dépôt ProductRepository, qui a la signature suivante:

IQueryable<Products> GetAllProducts()

Par conséquent, dans appel I ProductServices (productRepository est une instance de ProductRepository):

var products = productRepository.GetAllProducts(); 

qui remplit la products variable. Maintenant, je voudrais accéder au nom du ProductName produit de productServices. Si j'utilise cette instruction:

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

Je crée couplage entre ServiceLayer et EF (sans passer par le dépôt). Cela signifie que je dois ajouter à ProductRepository une méthode avec la signature:

IQueryable<string> GetAllProductsName()

Cependant, depuis que je besoin d'autres informations produit dans mon application, je vais créer une méthode dans productRepository pour chaque champ de la classe Product? Mon raisonnement correct? Merci

Était-ce utile?

La solution

Theres deux écoles de pensée autour de cela,

  1. Un référentiel définit explicitement la façon dont vous interagissez avec la base de données et doit être étroitement contrôlée. Par conséquent, les méthodes du référentiel doivent fournir des données énumérées
  2. Les pauses dépôt du fort couplage à un type de source de données spécifique, mais n'a pas besoin de fournir des ensembles de données détaillés et énumérés.

Personnellement, je souscris à la deuxième, Voici pourquoi:

mon sentiment est que lorsque vous obtenez trop explicite dans le référentiel, il se transforme en logique métier plutôt qu'un mécanisme de découplage. Je ne aime pas vraiment cela comme cela signifie que vous deveniez plus étroitement liées à la mise en œuvre du référentiel.

Je pense aussi que, dans certains cas, le dépôt isnt le bon endroit pour énumérer les données, par exemple, je crois que la pagination et le tri est une préoccupation de l'interface utilisateur, mais pour la performance que vous voulez des requêtes à ne concernent que la page en cours / trier. Cela signifie que vous soit nécessaire de laisser l'interface utilisateur contribuent à la compilation de la requête ou les besoins du référentiel pour comprendre la pagination et le tri.

Cela dit fournissant des sources de données énumérées un-ouvert ne vous pour des questions plus tard sur la piste, et même si vous ne leur fournissez est très important d'énumérer l'ensemble le plus rapidement possible.

Si vous êtes intéressés Heres mon avis sur les dépôts:

Autres conseils

Vous avez toutes les informations dans votre productServices parce que vous chargez toutes les informations de votre référentiel avec la méthode productRepository.GetAllProducts (). Si vous avez besoin plus d'informations à partir d'une autre entité, vous devez étendre vos productServices avec un nouveau service.

Cependant, depuis que je besoin d'autres informations produit dans mon application, Je vais créer une méthode dans productRepository pour chaque domaine de la Classe de produit? Mon raisonnement correct? Merci

Dans cette situation, normalement je crée des extensions méthode est pour le service et non dans le référentiel. Le dépôt ont normalement une configuration CRUD et rien de plus.

scroll top