【问题标题】:DDD/CQRS confusion regarding ReadModels and the Domain关于 ReadModels 和域的 DDD/CQRS 混淆
【发布时间】:2013-06-17 14:45:08
【问题描述】:

因此,经过大量阅读,我现在意识到复杂的报告功能不属于您的典型存储库,并且需要某种专用的“查找器”来返回要在报告中使用的只读对象。

我不清楚的是“Finder”类及其关联的 ReadModel 类应该放在我的项目中的什么位置? finder 是否类似于存储库,因为您在基础设施程序集中有一个用于 finder 的接口以及具体的 Readmodels?

这些类属于哪里?

【问题讨论】:

    标签: domain-driven-design repository-pattern cqrs


    【解决方案1】:

    我通常有一个逻辑查询“层”。合乎逻辑,因为我并不总是需要将它分成自己的程序集(从 .Net/C# 的角度来看)。它不应该在您的域中,因为该域不应该查询恕我直言。域涉及聚合、实体、值对象等。它需要的任何其他内容都需要输入到域对象中。查询位可能在应用服务边缘发挥更多作用。

    我最终得到的是我的存储库仅返回所需的完整聚合/实体以及在读取端实现的单独的 IQuery 接口。通常我将它放在DataAccess 程序集中。例如:

    public interface IUserQuery
    {
        bool ContainsEMail(string emailAddress);
        int NumberOfAdminisitrators();
        DataRow Profile(Guid id);
        DataTable FriendRequests(Guid id);
        SomeReadModel ForSomethingThatContainsSayAList(DateTime date);
    }
    

    您会注意到,如果可以的话,我会使用简单类型以及特定于技术的数据访问对象,例如 DataRowDataTable从不 DataSet :) --- 尽管 DataSet 可以用于复合数据,但是有点麻烦。

    我尝试将特定的读取模型 (DTO) 保持在最低限度,但有时在处理复合数据时可能需要它们。

    【讨论】:

    • 好吧,不是从 UserQuery 返回一个 IEnumerable 的 UserInfo 类,而是实际上返回 DataRows?请问你这背后的原因是什么?让 UserInfo 类存在于您的 UserQuery 可以填充和返回的域中不是明智的吗?从理论上讲,这将保护任何依赖于您的 UserQuery 类的代码免受下面使用的数据库引擎/框架的潜在更改?
    • 查询层应该是一个非常轻量级的实现。如果您对映射另一个类的额外开销感到满意,那也很好。这里真的没有“对”或“错”。你需要做你觉得舒服的事情。但是数据库中的更改无论如何都会导致更改某处 :)
    • Eben 感谢您对我的问题的回答,您为我指明了正确的方向,这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 2012-06-15
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2011-04-11
    相关资源
    最近更新 更多