4

以下のインターフェイスに示すように、デジタル電子書籍を保存するリポジトリを作成しているとします。このリポジトリには、書籍の実際のテキストと、書籍を識別するメタデータ (タイトル、著者、出版社、ISBN など) が保存されます。

public interface IBookRepository
{
    void AddBook(Book newBook);
    void DeleteBook(int bookId);
    void UpdateBook(Book updatedBook);
    Book GetBook(int bookID)
} 

public class Book
{
    public int BookId {get; set;}
    public string Title {get; set;}
    public string Author {get; set;}
    public IList<Page> Contents {get; set}
}

public class Page
{
    public int PageNumber {get; set;}
    public string PageContent {get; set;}
}

ほとんどの場合、書籍のテキスト全体を取得したくはありません。費用がかなりかかるためです。ほとんどの場合、気にするのはメタデータだけです。たとえば、本のリストを作成したいだけかもしれません。では、オブジェクトIBookRepositoryを返すメソッドを持つことも許可することは、DDD に関して許容されるのでしょうか? BookSummary本の要約オブジェクトにはメタデータが含まれますが、本の実際の内容は含まれません。

UpdateBook(BookSummary book)メソッドを持つことについてはどうですか?プロパティを更新したいがBook.Rating、これを行うためにリポジトリから本の内容全体を読み取る必要がない/したくないとします。

public interface IBookRepository
{
    //Full Book Methods
    void AddBook(Book newBook);
    void DeleteBook(int bookId);
    void UpdateBook(Book updatedBook);
    Book GetBook(int bookID)

    //BookSummary Methods
    BookSummary GetBookSummary(int bookID)
    IEnumerable<BookSummary> GetBooksByAuthor(string authorName);
    IEnumerable<BookSummary> GetBooksByGenre(int genreId);
    void UpdateBook(BookSummary bookSummary);
} 


public class BookSummary
{
    public int BookId {get; set;}
    public string Title {get; set;}
    public string Author {get; set;}
    public int PageCount {get; set;}
}

注:遅延読み込みでORMを使用することもこれに対する解決策になることは知っていますが、遅延読み込みが使用されることを前提とせずにリポジトリを設計したいと思います

4

3 に答える 3

2

DDD リポジトリでは、集約ルートでのみ機能する必要があります。あなたの場合、BookSummary は Book 集計内の単なるエンティティであると思います (もちろん、ここではより正確な分析が必要です)。そのため、BookRepository を介して Book を取得し、遅延読み込みを使用して集計ルートから BookSummary にトラバースする必要があります。それ以外の場合、ここではドメイン駆動設計を適用していません

于 2011-06-10T05:58:36.447 に答える
1

これは古い質問ですが、受け入れられた回答がないため、Google からここにアクセスする人々のために回答します。部分的な情報や複数のエンティティからコンパイルされた情報を表示する要約画面が多数あるため、常にこの問題に遭遇します。私がしているのは、@xelibrion の回答のコメントで提案されているように、個別の読み取りモデルを使用することです。完全な CQRS は使用せず、クエリ メソッドのみを使用した単純な読み取りモデルのみを使用します。したがって、BookRepository は次のようになります。

public interface IBookRepository
{
    void AddBook(Book newBook);
    void DeleteBook(int bookId);
    void UpdateBook(Book updatedBook);
    Book GetBook(int bookID)
}

BookSummary 読み取りモデルとそのメソッドは次のようになります。

public class BookSummary
{
    public int BookId {get; set;}
    public string Title {get; set;}
    public string Author {get; set;}
    public int PageCount {get; set;}
} 

public interface IBookSummaryQueries
{
    BookSummary GetBookSummary(int bookID)
    IEnumerable<BookSummary> GetBooksByAuthor(string authorName);
    IEnumerable<BookSummary> GetBooksByGenre(int genreId);
}

ここで Book を更新する方法はなく、クエリを実行するだけであることに注意してください

于 2016-05-19T18:03:24.900 に答える