2010-12-06 26 views
4

私は2つのエンティティPublisherとSocialAccountを持っています。 SocialAccountは、出版社が、多くのソーシャルアカウントに接続することができますし、1つの社会的なアカウントは複数の出版社が含まれているdddで多対多の関係

1、この社会的なアカウントは、別のエンティティのキ​​ャンペーンが接続されて TwitterやFacebookなどのように複数のアカウントが含まれています。両方とも独立したエンティティであることを意味します。

パブリッシャーインスタンスを作成するときに、ソーシャルアカウントを購読する必要はなく、後でそれを購読することができます。

パブリッシャーを1つまたは複数のソーシャルアカウントに登録する必要があります。どうすればいいですか

私はm関係を1対多の関係に、パブリッシャーとソーシャルアカウントの間で変換できますか?私は、多くの場所で、MとMとの関係を避けるべきであることを読んでいるので、わからない。

+0

エンティティ自体のコーディングについて、またはエンティティをデータベースに永続化する方法について質問しますか?エンティティについて話しているだけの場合は、SocialAccountを変更して、パブリッシャーのコレクションから単一のパブリッシャーへの参照を持つようにしてください。 – David

+0

私は両方を混乱させる。パブリッシャーはソーシャルアカウントの集約ルートではありません。どのように私はそれを維持します。 – chandra

+0

私は、DDDで関係がどのように処理されるかを知る必要があります。 1対多、多対多、同じ集合体と異なる集合体である。インターネットにそのような情報はありません。私はグーグルでグーグル – chandra

答えて

4

私は彼が正しい軌道に乗ってあなたをリードしていると思うように私は、ドンの答えを拡張してみましょう。

M対Nの関係は自然で有用であり、DDDで処理することができます。 M対Nの関係が必要な場合は、M対1の関係に変換しようとする必要はありません。 Udi Dahan's acticleは、エンティティ間のM対Nの関係を処理する方法の良い例を示しています。

まず、どちらのエンティティに他方のIDのリストを含めるべきかを決定します。 Udiは、ジョブ転記(Job)と求人掲示板(JobBoard)の例を使用しています。ジョブはジョブボードなしで存在し、ジョブボードはジョブなしでは存在できないため、JobBoardが集約ルートとして選択され、List<Job>が含まれます。これはM対1の関係のように見えるかもしれませんが、JobのそれぞれがJobBoardの複数のリストに含めることができるため、実際にはM対Nです。 SocialAccountPublisherのあなたの場合は

、私はC#で、このようなものをお勧めします。

public class Publisher 
{ 
    public int ID {get; private set;} 

    private readonly IList<int> _AssignedSocialAccounts = new List<int>(); 
    public IEnumerable<int> AssignedSocialAccounts { get { return this._AssignedSocialAccounts; } } 

    public Publisher(int ID) //Pass required fields to the constructor. 
    { 
     this.ID = ID; 
    } 

    public AssignSocialAccount(int SocialAccountID) 
    { 
     if(!this._AssignedSocialAccounts.Contains(SocialAccountID)) 
      this._AssignedSocialAccounts.Add(SocialAccountID); 
    } 
} 

public class SocialAccount 
{ 
    public int ID {get; private set;} 

    public SocialAccount(int ID) //Pass required fields to the constructor. 
    { 
     this.ID = ID; 
    } 
} 

(この例では、Jimmy Bogard's Wicked Domain Modelsに似たドメインのカプセル化を使用しています。)私はPublisherを選んだ

注意しますSocialAccountは単独で存在する可能性があるため、Publisherは意味がありません。SocialAccountが存在しません。

また、オブジェクト自体への参照ではなく、固有のIDを渡しています。これはDDDの一般的なアプローチであり、関連エンティティの遅延読み込みを可能にしますが、エンティティにアクセスするときにエンティティを取得するためにリポジトリを呼び出さなければならないというトレードオフがあります。

この方法は、すべてSocialAccountを1つの列挙体として持つわけでもありません。それらはさまざまなPublisherの間で分割されます。すべてSocialAccountのリストを取得するには、別のクエリが必要です。

+1

私は 'SocialAccount'と' Publisher'の両方が、独自の独立したライフサイクルを持つ集約ルーツであると言います。 –

+0

@EugeneKhudoy彼らは確かにすることができます。一般的なルールは、集約を小さくすることですが、実際はアプリケーションに依存します。 [規則:ドメイン小規模集合体の設計、ドメイン駆動設計の実装、Vaughn Vernon](http://www.informit.com/articles/article.aspx?p=2020371&seqNum=3) –