.NET-Programmier- und POCO-Klassen


9

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.

Antworten:


9

Wie Wyatt sagte, implizieren POCO und POJO in keiner Weise Methoden. Ich denke, das liegt daran, dass man nicht weiß, was Nicht-POCO und Nicht-POJO sind.

Erste Versionen von ORM-Technologien waren nicht POCO und POJO, nur weil die Entitäten eine Basisklasse vom Framework selbst erben mussten. Bei Java Entity Beans. Bei Entity Framework war POCO in der ersten Version nicht möglich, und jede Entität musste die EntityBasisklasse erben .

Diese Anforderung führte zu einer Abhängigkeit Ihres Datenmodells von der Persistenztechnologie, was viele Dinge schwierig oder unmöglich macht. Dinge wie das Testen des Modells durch Einheiten erfordern das Verspotten des Bean / Entity-Frameworks, was sich als praktisch unmöglich erwiesen hat. Sie können das Modell auch nicht mit einer anderen Persistenztechnologie verwenden oder Sie können das Modell nicht in einem anderen Kontext verwenden, z. B. in einer mobilen Umgebung.

Ihre Annahme, dass es bei POCO um die Nichtexistenz von Methoden geht, ist also falsch. Bei POCO geht es darum, das Modell getrennt von seiner Persistenztechnologie verwenden zu können.

Was Sie sprechen, ist wahrscheinlich nahe am anämischen Domänenmodell im Vergleich zum richtigen Domänenmodell.


Sie haben Recht, es sieht eher so aus, als hätte das anämische Domänenmodell diesen Artikel gelesen.
James

4

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.


Eh? poco impliziert meiner Erfahrung nach keinerlei Methoden - ansonsten handelt es sich je nach Verwendung um eine Entität, ein Modell oder ein Ansichtsmodell.
Telastyn

2
Das letzte Mal, als ich überprüft habe, ob ein einfaches altes C-Sharp-Objekt Methoden haben könnte. Der Begriff entstand in den bösen alten Zeiten, als Sie Dinge wie typisierte Datensätze hatten oder auf andere Weise Ihre Modellobjekte von bestimmten Klassen erben mussten und keine POCOs waren.
Wyatt Barnett

Die Trennung von Bedenken könnte erreicht werden, während die Methode auf dem Objekt bleibt, indem die Methode eine Schnittstelle akzeptiert. Diese Schnittstelle würde einen Typ angeben, der CRUD-Operationen für das Objekt verarbeiten kann.
James


0

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.

namespace MyApp
{
    public class MyClass
    {
        public string id;
        public string name;
        public int quantity;
        public decimal price;
    }   
}

namespace MyAppBL
{
    public static class MyClassBL
    {
        public static decimal PriceInCart(this MyClass myObject)
        {
            return myObject.quantity > 10 ? myObject.price * 0.9m : myObject.price;
        }
    }
}

namespace MyAppDA
{
    public static class MyClassDA
    {
        public static void Create()
        {
            …
        }

        public static void Read(string myObject)
        {
            …
        }

        public static void Update(this MyClass myObject)
        {
            …
        }

        public static void Delete(this MyClass myObject)
        {
            …
        }
    }
}

Dies gibt Ihnen eine sehr schöne myObject.PriceInCart()und myObject.Save()gleichzeitig Ihre Klasse auf die Daten konzentriert. Natürlich müssen Sie für statische Methoden MyAppDA.Create()statt haben MyApp.Create().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.