3

集約ルートに関して質問があります。子オブジェクトを削除する責任を負うべきですか、それともリポジトリまで責任を負うべきですか? Id で 1 つのファイルをクエリしたい場合、リポジトリでこのための特定のメソッドを作成する必要がありますか?

私の集約ルートのコードスニペット:

public class Folder {

   #region Properties

   public Guid Id { get;set; }
   public Name { get;set; }
   public virtual ICollection<File> Files { get;set; }

   #endregion

   #region Methods

   public File AddFile(string type, string title, bool share = false)
   {
     ///
   }

   #endregion
}

ファイルクラス:

public class File
{
    #region Properties

    public virtual Folder Folder { get; set; }
    public string Title { get; set; }
    public string Type { get; set; }
    public bool Shared { get; set; }

    #endregion

    #region Constructor

    public File(Folder folder, string type, string title, bool share = false)
    {
        ///
    }

    #endregion
}

ありがとう

4

3 に答える 3

6

集約ルートは、ドメイン不変条件を担当します ( http://dddcommunity.org/library/vernon_2011/を参照)。

したがって、答えはyesです。集約ルートは、集約するオブジェクトにアクセスできる唯一のオブジェクトである必要があります。これは、他のオブジェクトが File への参照を取得してはならず、その File が自身の状態を変更するメソッドを公開してはならないことを意味します。

子オブジェクトの状態を変更するすべてのメソッドは、集約された不変条件を保証する必要があるため、集約ルート自体によって公開される必要があります。

削除の永続化に関しては、通常、ドメイン イベントを .NET イベントとしてモデル化します。このようなイベントは、エンティティを返す前にリポジトリによってサブスクライブされます。したがって、イベント ハンドラーで永続化ロジックが発生します (詳細については、http://epic.tesio.it/doc/manual/observable_entities.htmlを参照してください) 。

于 2013-03-07T09:45:26.853 に答える
3

これは、コンテキストに大きく依存します。ファイルにフォルダーから独立した独自のライフサイクルがある場合、ファイルをエンティティ/AR にすることができます。ただし、これは、ファイルへの参照のみを持つように、フォルダー内のインスタンスの集約関係を壊す必要があることを意味します。このようなもの:

public class Folder
{
    public Guid Id { get;set; }
    public string Name { get;set; }

    public List<ContainedFile> Files { get;set; }
}


public class File
{
    public Guid Id { get;set; }

    public string Title { get;set; }
}

public class ContainedFile // or FolderFIle or whatever makes sense in your domain
{
    public Guid FileId { get;set; }
}

AR から他の AR インスタンスへの参照を保持するようにしてください。また、その双方向の関係 ( File.Folder) は必要ありません。これはおそらく、ドメイン モデルをナビゲーションに使用していることを示しています :) --- そうしないようにしてください。

于 2013-03-07T10:57:40.547 に答える
3

AggregateRoots は、その子オブジェクトを担当する必要があります。あなたの例の場合、Folder が Files のサイズの合計から決定される Size プロパティを公開していると想像してください。

long Size{get{return Files.Sum(f => f.Size);}

そのため、実際にファイルを削除するときは、フォルダーがそれを認識している必要があります。

現在は Size プロパティを持っていないかもしれませんが、DDD に従う目的の一部は、それを実装する必要があるときに簡単かつクリーンに実行できるようにすることです。

于 2013-03-13T21:57:35.310 に答える