假设我正在创建一个存储库来存储数字电子书,如下面的界面所示。该存储库将存储书籍的实际文本以及标识书籍的元数据(标题、作者、出版商、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;}
}
在大多数情况下,我不想检索这本书的全部文本,因为那样会相当昂贵。在大多数情况下,我关心的只是元数据,例如我可能只想创建一个书籍列表。那么,就 DDD 而言,允许IBookRepository
有返回的方法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 也可以解决这个问题,但我想设计我的存储库而不假设将使用延迟加载
如果您的域中有一个用例可以支持它,为什么不直接创建额外的实体 BookSummary 及其自己的存储库来完成这项工作呢? 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() 方法,则更有可能是 DAO,而不是 DDD 的存储库:http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/ http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)