Frage

Ich habe einen ASP.NET MVC3 in C# und Rasiermesser. Die Architektur der Anwendung ist in Datenzugriffsschicht (EF -Klassen + Repository), Serviceschicht, Controller, ViewModels und View geteilt.

Aus meiner Serviceschicht ProductServices Ich nenne die Methode GetAllProducts durch mein Repository entlarvt ProductRepository , was die folgende Unterschrift hat:

IQueryable<Products> GetAllProducts()

Daher innerhalb ProductServices Ich rufe (productRepository ist eine Instanz von ProductRepository):

var products = productRepository.GetAllProducts(); 

Das bevölkert die Variable products. Jetzt möchte ich auf den Namen des Produkts zugreifen ProductName aus productServices. Wenn ich diese Anweisung benutze:

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

Ich erstelle eine Kopplung zwischen Servicelegie und die EF (Umgang mit dem Repository). Das heißt, ich muss hinzufügen ProductRepository Eine Methode mit Signatur:

IQueryable<string> GetAllProductsName()

Da ich jedoch andere Produktinformationen in meiner Anwendung benötige, erstelle ich eine Methode in productRepository für jedes Feld der Product Klasse? Ist meine Argumentation korrekt? Vielen Dank

War es hilfreich?

Lösung

Es gibt zwei Gedankenschulen darüber,

  1. Ein Repository definiert explizit die Art und Weise, wie Sie mit der Datenbank interagieren und sollte eng gesteuert werden. Daher sollten Methoden im Repository aufgezählte Daten liefern
  2. Das Repository unterteilt die starke Kopplung an einen bestimmten Datenquerschnittstyp, muss jedoch keine detaillierten und aufgezählten Datensätze bereitstellen.

Persönlich abonniere ich die zweite, hier: Warum:

Ich habe das Gefühl, wenn Sie im Repository übermäßig explizit werden, wird es eher in die Geschäftslogik als in einen Entkopplungsmechanismus. Ich mag das nicht wirklich, da es bedeutet, dass Sie enger mit der Repository -Implementierung verknüpft werden.

Ich denke auch, dass das Repository in einigen Fällen nicht der richtige Ort ist, um die Daten aufzuzählen, beispielsweise glaube ich, dass Paging und Sortierung ein Benutzeroberflächenbetrag sind. Für die Leistung möchten Sie jedoch, dass Sie nur auf die aktuelle Seite/Sortierung beziehen. Dies bedeutet, dass Sie entweder die Benutzeroberfläche zur Abfragekompilierung beitragen müssen, oder das Repository muss das Paging und Sortieren verstehen.

Trotzdem öffnet Sie die Bereitstellung nicht ermächtigter DataSources für Probleme später auf der Strecke und selbst wenn Sie ihnen sehr wichtig sind, ist es sehr wichtig, das Set so schnell wie möglich aufzuzählen.

Wenn Sie interessiert sind, hier ist meine Einstellung zu den Repositories: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html Der gesamte Code befindet sich auch auf GitHub

Andere Tipps

Sie verfügen über alle Informationen in Ihren ProductServices, da Sie alle Informationen aus Ihrem Repository mit der Methode protoceTrepository.getallProducts () laden. Wenn Sie weitere Informationen von einem anderen Unternehmen benötigen, müssen Sie Ihre Produktservices mit einem neuen Service erweitern.

Da ich jedoch andere Produktinformationen in meiner Anwendung benötige, soll ich für jedes Feld der Produktklasse eine Methode in ProductTrepository erstellen? Ist meine Argumentation korrekt? Vielen Dank

In dieser Situation erstelle ich normalerweise Erweiterungsmethoden für den Dienst und nicht im Repository. Das Repository hat normalerweise ein CRUD -Setup und nichts weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top