以下のインターフェイスに示すように、デジタル電子書籍を保存するリポジトリを作成しているとします。このリポジトリには、書籍の実際のテキストと、書籍を識別するメタデータ (タイトル、著者、出版社、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を使用することもこれに対する解決策になることは知っていますが、遅延読み込みが使用されることを前提とせずにリポジトリを設計したいと思います