Was ist der Unterschied zwischen Domänenobjekten, POCOs und Entitäten?


81

Ich hatte den Eindruck, dass sie im Grunde alle gleich sind. Sind Modellobjekte auch gleich?

Im Moment habe ich in meiner Architektur:

class Person 
{

    public string PersonId;        
    public string Name;
    public string Email;

    public static bool IsValidName() { /* logic here */ }
    public static bool IsValidEmail() { /* logic here */ }
}


class PersonService
{
    private PersonRepository pRepository;

    PersonService()
    {
        pRepository = new PersonRepository();
    }

    public bool IsExistingEmail(string email)
    {
        //calls repo method to see if email is in db
    }


    public Person GetPerson(email)
    {
        return pRepository.Get(email);
    }


    public void SavePerson(Person p)
    {
        if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email)
        {
            pRepository.Save(p);
        }
    }

}


class PersonRepository
{
    public void Save(Person p)
    {
        //save to db
    }

    public Person Get(string email)
    {
        //get from db
    }

    public bool IsExistingEmail(string email)
    {
        //see if email in db
    }

}

Welche der oben genannten Klassen sind POCO, Domain Object, Model object, entity?

Antworten:


115

Meine (nicht standardmäßigen) Laiendefinitionen

  • POCO- Einfaches altes% Insert_Your_Language% -Objekt. Ein Typ ohne Logik. Es werden nur Daten im Speicher gespeichert. Normalerweise werden darin nur automatische Eigenschaften angezeigt, manchmal Felder und Konstruktoren.
  • Domain objectEine Instanz einer Klasse, die sich auf Ihre Domain bezieht. Ich würde wahrscheinlich Satelliten- oder Dienstprogrammobjekte vom Domänenobjekt ausschließen, z. B. enthalten Domänenobjekte in den meisten Fällen keine Elemente wie Protokollierung, Formatierung, Serialisierung, Verschlüsselung usw. - es sei denn, Sie erstellen speziell ein Produkt zum Protokollieren, Serialisieren, Formatieren oder Verschlüsseln .
  • Model object Ich denke ist das gleiche wie Domain object . Leute neigen dazu, dies austauschbar zu verwenden (ich kann mich irren)
  • Entity eine Klasse, die hat id
  • RepositoryEine Klasse, die von einer Seite mit einem Datenspeicher (z. B. einer Datenbank, einem Datendienst oder ORM) und mit dem Dienst, der Benutzeroberfläche, der Geschäftsschicht oder einem anderen anfragenden Körper spricht. Es verbirgt normalerweise alle datenbezogenen Dinge (wie Replikation, Verbindungspooling, Schlüsselbeschränkungen, Transaktionen usw.) und macht es einfach, nur mit Daten zu arbeiten
  • ServiceSoftware, die einige Funktionen normalerweise über die öffentliche API bereitstellt. Abhängig von der Ebene kann es sich beispielsweise um einen in sich geschlossenen RESTful-Container oder eine Klasse handeln, mit der Sie eine bestimmte Instanz des erforderlichen Typs finden können.

Ursprüngliche Antwort

Dies sind Begriffe , die hauptsächlich im (verteilten) domänengesteuerten Design verwendet werden. Sie sind nicht gleich. Der Begriff Modellobjekt kann als Synonym für das Domänenobjekt verwendet werden .

Domänenobjekte. Objekte aus dem geschäftsspezifischen Bereich, die für den Domain-Experten von Bedeutung sind. Domänenobjekte werden meist durch Entitäten und Wertobjekte dargestellt. Im Allgemeinen tragen die meisten Objekte, die in der Domänenschicht leben, zum Modell bei und sind Domänenobjekte.

Entität. Ein Objekt, das grundsätzlich nicht durch seine Attribute definiert ist, sondern durch einen Faden der Kontinuität und Identität. (Das heißt, es muss einen Ausweis haben )

POCO. Ein einfaches Objekt ohne komplizierte Logik, normalerweise hat es nur wenige Eigenschaften und wird mit ORM oder als Datenübertragungsobjekt verwendet

class Person- Entität und POCO, Instanz dieser Klasse ist Domain Object
class PersonService- Service
class PersonRepository- Repository


4
Bitte sehen Sie sich mein Codebeispiel oben an und lassen Sie mich wissen, wie Sie die Bedingungen anwenden würden.
Jpshook

Gute Antwort. Ich war bereit, diese Frage zu beantworten, aber das wäre eine Kopie Ihrer Antwort. Ich kann hinzufügen, dass Sie neben Entitäts- und Wertobjekten auch Domänenereignisse usw. haben. Alle Objekte, die in der Domänenebene leben und zum Modell beitragen, sind Domänenobjekte.
Magnus Backeus

1
Wenn ein POCO nicht identifiziert werden muss, wie kann er dann von einem ORM geladen werden? Das ist nicht logisch!
Pascal

1
Warum sind diese offensichtlich falschen Informationen die am meisten bewerteten und akzeptierten? POJO ist KEIN Typ ohne Logik. Tatsächlich hat Martin Fowler den Begriff POJO speziell geprägt, um sich von Entity Beans abzuheben ("Wir haben auf die vielen Vorteile der Codierung von Geschäftslogik in reguläre Java-Objekte hingewiesen, anstatt Entity Beans zu verwenden."). martinfowler.com/bliki/POJO.html
DIESER BENUTZER BRAUCHT HILFE

1
Es tut mir leid, wenn mein Kommentar stark formuliert war, aber auch hier spielt Ihre persönliche Erfahrung keine Rolle, wenn der Coiner des Begriffs POJO so definiert hat, dass er Geschäftslogik explizit enthält. Tatsächlich würde er Ihre Praxis unter dem anämischen Domänenmodell ( martinfowler.com/bliki/AnemicDomainModel.html ) klassifizieren, das er als Anti-Pattern betrachtet, und er empfiehlt, stattdessen POJO zu verwenden. Ob es sich um ein Anti-Pattern handelt, fällt nicht in den Geltungsbereich dieser Definition, aber eines ist klar: POJO bedeutet kein Objekt ohne Geschäftslogik.
DIESER BENUTZER BRAUCHT HILFE

18

Es ist eher eine Konnotation der Funktion; Ein Domänenobjekt ist spezifisch für Ihre Logikimplementierung und möglicherweise komplexer als ein einfaches POCO. Eine Entität hat eine Konnotation, um etwas darzustellen (normalerweise in Bezug auf ein Persistenzmedium), und ein POCO ist nur eine schnelle Kennung für eine Klasse. Ein Modell ist nur ein Begriff, der zur Darstellung eines Objekts verwendet wird (normalerweise mit Status und normalerweise mit der Benutzeroberfläche oder der Datenbank).

Es ist nicht so, dass es einen funktionalen Unterschied gibt, es sind nur verschiedene Begriffe, um etwas genauer zu beschreiben. Wie der Unterschied zwischen Rennwagen, LKW und Familienlimousine. Alle sind Automobile, aber jeder Begriff ist aussagekräftiger.


Ich habe ein Codebeispiel aktualisiert. Können Sie dies bitte kommentieren? Ich möchte nur sicherstellen, dass ich bei Fragen die richtigen Begriffe verwende.
Jpshook

18

Im Grunde kommt es auf die interne Logik an

  1. Domänenobjekte verfügen über eine interne Domänenlogik für Dinge wie Validierung usw.
  2. Das Modell ist im Grunde ein leichtes Domain-Objekt. Sie wissen um die Daten, die sie enthalten, aber nicht wirklich darüber, wie sie verwendet werden sollen
  3. Entitäten enthalten Daten und verfügen über internes Wissen darüber, woher sie stammen und wo sie gespeichert, aktualisiert usw.
  4. POCO enthält Daten und verfügt möglicherweise über internes Wissen über sich selbst, z. B. den Gesamtwert aller Elemente in einer Eigenschaftssammlung
  5. DTO ist das einfachste Element von allen, es enthält nur Daten und hat keine Logik

Sie werden alle im Grunde genommen für dasselbe verwendet, es ist nur so schlau, wie Sie sie haben wollen

gemäß Ihrem Codebeispiel Die Person-Klasse wäre ein Domänenobjekt oder ein Modell, die anderen 2 sind ein Dienst und ein Repository. Domänenobjekte, Pocos, Modelle, Dtos usw. werden wie Nachrichten verwendet, die von einer Schicht zur nächsten übergeben werden. Eine Serviceklasse wie PersonService ist eine Schicht in der Anwendung und dieselbe wie die Repository-Klasse wie PersonRepository. Eine gute Übersicht finden Sie unter http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html. In diesem Fall geht es um die Verwendung eine Datenentität, die im Grunde ein dto ist


11

In den obigen Antworten gibt es bereits gute Erklärungen zu Domäne und Modell.

In einem Datenbankkontext bedeutet Entität Element in einem Entitätsbeziehungsmodell ERD . (dh eine Zeile in einer Tabelle)

In der Microsoft-Dotnet-EntityFramework-World- Entität bedeutet ein Objekt, das mithilfe eines Datenkontexts ( Basiskontexts) aus einer Datenbank geladen und in einer Datenbank gespeichert werden kann. Normalerweise kann eine Entität ohne ihren Datenkontext (Basiskontext) nicht existieren. (Unit-) Das Testen der Geschäftsfunktionalität dieser Klassen ist schwierig.

Pocos (einfache alte CommonRuntime-Objekte) können ohne PersistenceFramework (EntityFramework oder NHibernate) existieren und sind daher viel einfacher zu testen.

Das Wort poco ist die Adaption von pojo (einfaches altes Java-Objekt) , die aus demselben Grund in der Java-Welt geschaffen wurden.


Was ist der Grund für das Downvoting? Die Frage war "Was ist der Unterschied zwischen Domänenobjekten, POCOs und Entitäten?" Ich erklärte den Unterschied zwischen Entity und Poco
k3b

"In den obigen Antworten finden sich bereits gute Erklärungen zu Domain und Modell." Wie kann ich eine Antwort, die von anderen Antworten abhängt, als gültige Antwort auswählen?
Jpshook

np. Im Nachhinein hätte ich Sie nur um eine vollständige Antwort bitten sollen. Werde das nächste Mal 2x nachdenken.
Jpshook

3

Ein Domänenobjekt ist eine Entität in der Domänenschicht Ihrer Anwendung, z. eine Adressklasse. "Modell" bedeutet dasselbe - eine Entität im "Domänenmodell".

Ein POCO (einfaches altes CLR-Objekt) ist ein Objekt, für das kein Verhalten (Methoden) definiert ist und das nur Daten (Eigenschaften) enthält. POCOs werden im Allgemeinen als DTOs (Datentransportobjekte) verwendet, um Daten zwischen Schichten zu übertragen, und die Daten werden dann üblicherweise verwendet, um ein Domänenobjekt / eine Domänenentität zu füllen.


Kann ein POCO keine Einheit sein? Ich dachte, POCOs können sich verhalten, müssen aber hartnäckig sein?
Jpshook

@Developr Ja, Ihre Domain-Modelle / Entitäten könnten tatsächlich POCOs sein - dies ist ein sogenanntes "anämisches" Domain-Modell - siehe martinfowler.com/bliki/AnemicDomainModel.html
MattDavey

Wie würden Sie diese Anämie betrachten? Wie definieren Sie "Rich Domain Object"? Welche umfangreichen Funktionen können die Domänenobjekte haben, wenn sie nicht direkt oder indirekt mit der Datenbank interagieren können?
Jpshook

@Developr Ich würde ein Domänenmodell betrachten, das aus anämischen POCO-Objekten besteht, da POCO-Klassen traditionell keine reichhaltige Funktionalität haben, sondern nur Daten. Nach dem Prinzip der Trennung von Bedenken ( en.wikipedia.org/wiki/Separation_of_concerns ) sollte sich ein Objekt im Domänenmodell überhaupt nicht mit dem Datenbankzugriff befassen (daher der beliebte Begriff "Persistenz-Ignoranz"). Die Art von Funktionalität, die eine Entität im Domänenmodell haben sollte, wäre Geschäftslogik - sie sollte die logischen Regeln und Workflows des Problems / der Domäne, die sie darstellen, erfassen und kapseln.
MattDavey
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.