【问题标题】:Where should I place read models in the DDD architecture?我应该将读取模型放在 DDD 架构中的什么位置?
【发布时间】:2022-02-18 16:52:07
【问题描述】:

目前我在没有事件溯源的情况下学习 CQRS 和 DDD(还没有)。我需要从我的存储库向查询处理程序返回与域模型不同的模型。 我应该在域项目中创建读取模型吗?我需要在存储库(基础设施项目)、存储库接口(域项目)和查询处理程序(应用程序项目)?

进一步说明:

在我的数据库中,我有一个表 Posts 与表 Comments 相关。表 Comments 中有一个外键:PostId。 这是我项目中的域模型,您可以看到 Comment 中没有 PostId:

public class Post : Entity, IAggregateRoot
{
    public Guid PostId { get; private set; }

    public string Title { get; private set; }

    public string Content { get; private set; }
    
    public List<Comment> Comments { get; private set; }
}

public class Comment : Entity
{
    public Guid CommentId { get; private set; }

    public string Author { get; private set; }

    public string Content { get; private set; }
}

我想从我的存储库返回一个评论,其中不仅包含CommentIdAuthorContent,还包含PostIdPostTitle。这是我的存储库:

public class CommentsRepository : ICommentsRepository
{
    private readonly ApplicationDbContext _applicationDbContext;

    public CommentsRepository(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    public async Task<Comment> GetByIdAsync(Guid id)
    {
        var comment = await _applicationDbContext.Comments
            .SingleOrDefaultAsync(x => x.CommentId == id);

        return comment;
    }
}

我是否应该创建一个模型CommentReadModel(具有属性:CommentIdAuthorContentPostIdPostIdPostTitle)并在存储库中编写 SQL 来填充该模型?如果是,我应该将该模型放在哪里,因为 3 个项目都需要它:

  • DomainProject(有接口:ICommentsRepository
  • InfrastructureProject(有实现:CommentsRepository
  • ApplicationProject(有一个调用存储库的查询处理程序) ??

【问题讨论】:

    标签: c# architecture domain-driven-design cqrs clean-architecture


    【解决方案1】:

    当然,您应该将读取模型放置在域层中。在实现应用程序的读取端时,您还应该抛弃任何复杂性。存储库在使用写入模型(聚合)时非常有用,因为它们可以封装一些基础架构逻辑(例如域事件调度、日志记录等)。您在读取端不需要任何这些功能。只需在您的查询处理程序中使用 Entity Framework(或 Dapper 的)引擎并直接获取数据,或者如果您愿意,可以在它们之上实现一些轻量级的查询外观。

    您还可以阅读此Microsoft article 关于 CQRS 应用程序中的查询端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2012-11-12
      • 2020-11-22
      • 2017-02-26
      • 2011-12-26
      • 1970-01-01
      • 2010-12-04
      • 2012-07-22
      相关资源
      最近更新 更多