当前位置 : 主页 > 手机开发 > 其它 >

域驱动设计 – DDD存储库是否可以使用摘要对象添加到“真实”对象中

来源:互联网 收集:自由互联 发布时间:2021-06-22
假设我正在创建一个存储数字电子书的存储库,如下面的界面所示.此存储库将存储书籍的实际文本,以及标识书籍的元数据(标题,作者,出版商,ISBN等). public interface IBookRepository{ void AddBook
假设我正在创建一个存储数字电子书的存储库,如下面的界面所示.此存储库将存储书籍的实际文本,以及标识书籍的元数据(标题,作者,出版商,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.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/

网友评论