So greifen Sie auf EF -Klasseneigenschaften aus der Serviceebene zu
-
28-10-2019 - |
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
Lösung
Es gibt zwei Gedankenschulen darüber,
- 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
- 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.