Ich habe heute Abend nachgedacht, während ich über eine Anwendung nachgedacht habe, die ich ändern muss, und es hat mich zum Nachdenken gebracht. Entity Framework-Entitäten sind POCO (Plain old CLR Objects), und in ASP.NET MVC verwendete Modelle sind normalerweise auch POCO. Dies bedeutet im Grunde nur Eigenschaften, keine Methoden.
Jetzt ermöglicht die OO-Programmierung normalerweise einem Objekt, seine Funktionalität zu kapseln, einschließlich seiner Eigenschaften sowie seiner Methoden. Dies ermöglicht Polymorphismus. Mit dem Aufkommen von POCO-Klassen sind Entwurfsmuster wie generische Repositories immer beliebter geworden. Wenn meine Objekte früher ihre eigenen CRUD-Operationen hatten, habe ich sie jetzt in einem Repository.
Ist dies nur eine Weiterentwicklung von OO, bei der CRUD-Operationen von den Objekten entfernt werden, damit sie entkoppelt werden können, oder sollten CRUD-Operationen in der Vergangenheit nicht auf Objektebene sein sollten und ich mich geirrt habe? Zum Teufel, vielleicht sind beide absolut legitim und waren es schon immer. Es ist nur eine Beobachtung, die mich zum Nachdenken brachte, also dachte ich mir, ich würde andere Meinungen einholen.
POCO impliziert in keiner Weise, dass es keine Methoden gibt - obwohl die meisten Beispiele, die man sieht, einen Großteil der automatischen MVC-Bindungsfunktionen verwenden, die sich hauptsächlich mit Eigenschaften befassen und Methoden ignorieren.
Wenn die Persistenz in Ihre Modellobjekte eingebettet ist, verstößt dies gegen die Trennung von Bedenken und macht es sehr schwierig, Dinge wie Unit-Tests der Objekte durchzuführen, ohne eine Datenbank aufzubauen. Es ist keine Funktion des Modellobjekts, sondern eine Funktion einer anderen Klasse, z. B. eines Repositorys.
quelle
Nur zwei verschiedene Ansätze mit jeweils eigenen Vorzügen.
/programming/1519669/data-access-layer-or-having-object-with-crud-methods
quelle
Ich habe in letzter Zeit Erweiterungsmethoden für solche Dinge verwendet.
Der POCO enthält Logik, die nur für das Objekt selbst Sinn macht. Geschäftslogik oder koordinierte Objektlogik wird in eine BL-Erweiterung eingefügt. Der Datenzugriff kann entweder in eine Datenzugriffsschicht oder in eine Datenzugriffserweiterung erfolgen.
Dies gibt Ihnen eine sehr schöne
myObject.PriceInCart()
undmyObject.Save()
gleichzeitig Ihre Klasse auf die Daten konzentriert. Natürlich müssen Sie für statische MethodenMyAppDA.Create()
statt habenMyApp.Create()
.quelle