【发布时间】: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; }
}
我想从我的存储库返回一个评论,其中不仅包含CommentId、Author、Content,还包含PostId 和PostTitle。这是我的存储库:
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(具有属性:CommentId、Author、Content、PostId 和PostId 和PostTitle)并在存储库中编写 SQL 来填充该模型?如果是,我应该将该模型放在哪里,因为 3 个项目都需要它:
- DomainProject(有接口:
ICommentsRepository) - InfrastructureProject(有实现:
CommentsRepository) - ApplicationProject(有一个调用存储库的查询处理程序) ??
【问题讨论】:
标签: c# architecture domain-driven-design cqrs clean-architecture