加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:52:07 所属栏目:百科 来源:网络整理
导读:假设我正在创建一个存储数字电子书的存储库,如下面的界面所示.此存储库将存储书籍的实际文本,以及标识书籍的元数据(标题,作者,出版商,ISBN等). public interface IBookRepository{ void AddBook(Book newBook); void DeleteBook(int bookId); void UpdateBoo
假设我正在创建一个存储数字电子书的存储库,如下面的界面所示.此存储库将存储书籍的实际文本,以及标识书籍的元数据(标题,作者,出版商,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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读