假设我正在创建一个存储数字电子书的存储库,如下面的界面所示.此存储库将存储书籍的实际文本,以及标识书籍的元数据(标题,作者,出版商,ISBN等). public interface IBookRepository{ void AddBook
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;} }
在大多数情况下,我不想检索书籍的整个文本,因为这样会相当昂贵.在大多数情况下,我关心的只是元数据,例如我可能只想创建一个书籍列表.那么在DDD方面是否也允许IBookRepository具有返回BookSummary对象的方法?书籍摘要对象将包括元数据,但不包括书籍的实际内容.
有一个UpdateBook(BookSummary书)方法怎么样?假设我想更新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也可以解决这个问题,但我想设计我的存储库而不假设将使用延迟加载
如果您的域中有一个支持它的用例,为什么不创建额外的实体BookSummary以及它自己的Repository来完成这项工作呢? BookSummary持久存在并不重要 – 它与域无关.使用普遍存在的语言从域派生实体非常重要,而不是查看数据库结构.
public interface IBookRepository { //Full Book Methods void Add(Book Book); void Delete(Book Book); Book findById(int bookID) } public interface IBookSummaryRepository { //Full Book Summary Methods void Add(BookSummary BookSum); void Delete(BookSummary BookSum); Book findById(int bookSummaryID) }
如果您的存储库具有方法update()或store(),则它更可能是DDD而不是DDD:http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/