web-dev-qa-db-ja.com

ドメインオブジェクト、POCO、およびエンティティの違いは何ですか?

私はそれらがすべて基本的に同じであるという印象を受けていました。モデルオブジェクトも同じですか?

今、私のアーキテクチャには、次のものがあります。

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
    }

}

上記のクラスのどれがPOCODomain ObjectModel objectentity

72
jpshook

私(非標準)のレイマン定義

  • POCO-プレーンオールド%Insert_Your_Language%オブジェクト。ロジックを持たないタイプ。データをメモリに保存するだけです。通常、自動プロパティが表示されますが、フィールドやコンストラクターが表示されることもあります。
  • Domain objectは、ドメインに関連するクラスのインスタンスです。ドメインオブジェクトからサテライトまたはユーティリティオブジェクトを除外します。ほとんどの場合、ドメインオブジェクトには、ロギング、フォーマット、シリアル化、暗号化などは含まれません-特に、ログ、シリアル化、フォーマット、または暗号化する製品を構築する場合を除きます。
  • Model objectは、Domain objectと同じだと思います。人々はこれを交換可能に使用する傾向があります(間違っている可能性があります)
  • Entityidを持つクラス
  • Repository片側からのデータストレージ(データベース、データサービス、ORMなど)およびサービス、UI、ビジネスレイヤー、またはその他の要求元と通信するクラス。通常、すべてのデータ関連のもの(レプリケーション、接続プーリング、キー制約、トランザクションなど)を隠し、データの操作だけを簡単にします。
  • Service通常はパブリックAPIを介していくつかの機能を提供するソフトウェア。レイヤーに応じて、たとえばRESTfulな自己完結型コンテナ、または必要なタイプの特定のインスタンスを検索できるクラスにすることができます。

元の答え

これらは terms で、主に(Distributed)Domain Driven Designで使用されます。それらは同じではありません。用語model Objectは、domainオブジェクトの同義語として使用できます。

ドメインオブジェクト。ドメイン専門家にとって意味のある何かを表すビジネス固有の領域のオブジェクト。ドメインオブジェクトは、ほとんどエンティティと値オブジェクトによって表されます。一般的に言えば、ドメイン層に存在するほとんどのオブジェクトはモデルに寄与し、ドメインオブジェクトです。

Entity。基本的にその属性ではなく、連続性とアイデンティティのスレッドによって定義されたオブジェクト。 (意味するmusthaveId

POCO。複雑なロジックのない単純なオブジェクトで、通常はプロパティがいくつかあり、ORMまたはデータ転送オブジェクトとして使用されます

class Person-エンティティおよびPOCO。このクラスのインスタンスはドメインオブジェクトです
class PersonService-サービス
class PersonRepository-リポジトリ

92
oleksii

それは機能の意味合いです。ドメインオブジェクトは、ロジック実装に固有のものであり、単純なPOCOよりも複雑になる場合があります。エンティティには何かを表す意味があり(通常は永続化メディアを参照)、POCOはクラスの簡単な識別子です。モデルは、オブジェクト(通常は状態を含み、通常はUIまたはDBを処理する)を表すために使用される用語です。

機能的な違いがあるわけではなく、何かをより詳しく説明するための異なる用語です。レースカー、トラック、ファミリーセダンの違いのように。すべては自動車ですが、各用語はより説明的です。

18
Tejs

基本的には内部ロジックになります

  1. ドメインオブジェクトには、検証などの内部ドメインロジックがあります。
  2. モデルは基本的に軽いドメインオブジェクトであり、保持するデータについては知っていますが、実際にどのように使用されるかについては何も知りません
  3. エンティティはデータを保持し、どこから来たのか、どこで保存、更新などを行うのかについての内部的な知識を持っています
  4. POCOはデータを保持し、自己についての内部的な知識(プロパティコレクション内のすべてのアイテムの合計値など)を持っている場合があります
  5. DTOは最も単純なアイテムで、データを保持するだけで、ロジックはありません

それらは基本的にすべて同じことのために使用されます。

コードサンプルによると、Personクラスはドメインオブジェクトまたはモデルになり、他の2つはサービスとリポジトリになります。ドメインオブジェクト、Poco、モデル、dtoなどは、メッセージが1つのレイヤーから次のレイヤーに渡されるように使用されます。PersonServiceのようなサービスクラスはアプリケーションのレイヤーであり、PersonRepositoryのようなリポジトリクラスと同じです。概要については http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html をご覧ください。この場合、基本的にdtoであるデータエンティティの使用について説明しています

15
Bob The Janitor

上記の回答には、すでにドメインとモデルの適切な説明があります。

データベースコンテキストでは、エンティティは エンティティリレーションシップモデルERD のアイテムを意味します。 (つまり、テーブルの行)

Microsoft-Dotnet-EntityFramework-World エンティティでは、Data(Base)Contextを使用してデータベースからロードおよびデータベースに保存できるオブジェクトを意味します。通常、エンティティはそのData(Base)Contextなしでは存在できません。 (単元)これらのクラスのビジネス機能のテストは困難です。

Pocos(Plain Old CommonRuntime Objects) PersistenceFramework(EntityFrameworkまたはNHibernate)なしで存在できるため、テストがはるかに簡単です。

Word pocoは、同じ理由でJava worldで作成された pojo(plain old Java object) の適応です。

11
k3b

ただのデザインのヒント。

使用する代わりに:

class PersonService
{
    private PersonRepository pRepository;

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

つかいます:

class PersonService
{
    private PersonRepository pRepository;

    PersonService(PersonRepository pRepository)
    {
        this.pRepository = pRepository;
    }
}

PersonServiceへの依存性注入を提供します。

5

ドメインオブジェクトは、アプリケーションのドメイン層のエンティティです。たとえば、 Addressクラス。 「モデル」は同じことを意味します-「ドメインモデル」のエンティティ。

POCO(プレーンな古いCLRオブジェクト)は、動作(メソッド)が定義されておらず、データ(プロパティ)のみを含むオブジェクトです。 POCOは一般に、レイヤー間でデータを運ぶためのDTO(データ転送オブジェクト)として使用され、データは一般にドメインオブジェクト/エンティティに入力するために使用されます。

2
MattDavey