除了“真实”对象之外,DDD 存储库还可以使用摘要对象吗?

2024-05-05

假设我正在创建一个存储库来存储数字电子书,如下面的界面所示。该存储库将存储书籍的实际文本以及标识书籍的元数据(标题、作者、出版商、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(使用前将#替换为@)

除了“真实”对象之外,DDD 存储库还可以使用摘要对象吗? 的相关文章

  • 如何解决客户端-服务器应用程序中的无状态问题?

    我读过一些有关创建无状态网站的书籍 也读过一些有关有状态客户端应用程序的书籍 但是当您必须将两者结合起来时 就会出现很多复杂性 我们有一个 Flex 应用程序 需要通过 NET 服务将数据保存到数据库中 需要记住的事情是 并发 乐观 悲观
  • 使用 DDD 方法在 Python 中保留 POJO

    我正在尝试使用 DDD 模式创建 Flask 应用程序 DDD 的核心原则之一是将领域与持久性 基础设施 分离 我已在模块中定义了域模型 并将在基础设施模块中创建存储库 但是 我似乎找不到任何关于如何在 Python 中持久保存 POJO
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了
  • Java 8 的迭代器与流

    为了利用广泛的查询方法包括java util stream在 Jdk 8 中 我尝试设计领域模型 其中 getters 的关系 多重性 零个或多个实例 返回一个Stream
  • BL 服务:异常还是方法结果?

    最好的方法是什么 为什么 V1 try var service IoC Resolve
  • 有界上下文共享相同的聚合

    DDD 公开了有界上下文 领域模型 聚合 但我经常错过业务规则的关键点 我想知道业务规则如何集成到这种方法中 这是一个例子 假设您在一家信贷公司中有 2 个有界上下文 一项用于追偿债务 另一项用于提前退款 这些背景嵌入了真正的业务特性 从概
  • 服务层/存储库模式

    我正在使用 EF4 的服务层 存储库 工作单元模式构建一个 MVC 应用程序 我对逻辑有点困惑 我知道重点是解耦系统 但我有点困惑 因此 MVC 控制器调用服务来填充视图模型 那么可以肯定地说 MVC 应用程序耦合到服务层吗 然后服务层调用
  • 如何使用存储库模式在 EF Core 3.0 中进行并行异步查询?

    我有像这样的存储库 public interface IEmployeeRepository Task
  • 我应该如何将 IoC DI 与此存储库模式结合使用?

    我正在使用在这个问题的答案中找到的存储库模式 为每个对象创建通用存储库与特定存储库的优势是什么 https stackoverflow com questions 1230571 advantage of creating a generi
  • 将多个 DbContext 与通用存储库和工作单元结合使用

    我的应用程序变得越来越大 到目前为止我只有一个MyDbContext其中包含我的应用程序中所需的所有表格 我希望 为了概述 将它们分成多个DbContext like MainDbContext EstateModuleDbContext
  • 是否有在基于 DDD 的分层架构中的模型层和数据访问层之间使用 LINQ 的建议模式

    我一直在读蒂姆 麦卡锡的书关于 NET 中的 DDD 的精彩书籍 http www amazon co uk NET Domain Driven Design Solution Programmer dp 0470147563 但在他的示例
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • DDD 领域模型复杂验证

    我正在努力使用域驱动设计原则重写我的 ASP NET MVC 应用程序 我正在尝试验证我的用户实体 到目前为止 我能够验证基本规则 例如用户名和密码是非空 空白字符串 然而规则之一是 我需要确保用户名是唯一的 但是 我需要访问数据库才能执行
  • 有界上下文、子域和通用语言

    a 对于包含两个或多个子域的 BC 存在概念重叠的可能性 甚至更糟糕的是 相同的概念 由其中几个子域使用 可能会被每个子域以不同的方式解释 理解 无论如何 如果 BC 确实包含许多子域 它是否应该提供几种通用语言 每个子域一种 或者所有子域
  • 泛型和实体框架:如何根据列值返回不同的类型

    我们有一个人员表 其中存储不同类型的人员 买方 卖方 代理人等 我们的 ORM 是实体框架 CodeFirst CTP5 我们使用存储库模式来实现良好的 TDD 和模拟 在 PersonRepository 中 我想返回特定类型 这样我就可
  • 实体框架中的聚合根支持

    我们如何告诉实体框架骨料 http domaindrivendesign org node 88 保存聚合时 保存聚合内的实体 删除聚合时 删除聚合内的实体 当两个不同的用户尝试修改同一聚合中的两个不同实体时引发并发错误 加载聚合时 即使在
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 使用 SOA、UoW、Repository、DataContext 和多个数据库设计多租户应用程序

    首先 我对这篇文章的篇幅表示歉意 但我想提供尽可能多的细节 以增加得到答案的机会 提前致谢 我正在向集成来自多个数据库的数据的现有应用程序添加新功能 简而言之 它允许客户和 或其会计师访问和更新有关其位置的财务信息 该应用程序有 3 层 其
  • 如何将当前用户信息传递到 DDD 中的所有层

    类似的问题以前曾被问过 但不完全相同 除非我错过了 我想通过我的服务 域 域事件 域事件处理程序传递 IUserInfo 类实例 什么是最好的方法 我是不是该 通过注册使用 IoC 注入它 针对 Httpcontext Current se
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity

随机推荐