因此,经过大量阅读后,我现在意识到复杂的报告功能不属于您的典型存储库,需要某种专用的“Finder”返回只读对象以用于报告。
我不清楚“Finder”类及其关联的 ReadModel 类应该放在我的项目中的什么位置?查找器是否像存储库一样,因为您在基础结构组件中有一个查找器接口(interface)以及具体的 Readmodels?
这些类属于哪里?
最佳答案
我通常有一个逻辑查询“层”。合乎逻辑,因为我并不总是需要将它分成自己的程序集(从 .Net/C# 的角度来看)。它不应该在您的域中,因为该域不应该查询恕我直言。域与聚合、实体、值对象等有关。它需要的任何其他东西都需要输入到域对象中。查询位可能在应用程序服务边缘发挥更多作用。
然后我最终得到的是我的存储库仅返回所需的完整聚合/实体和一个在读取端实现的单独的 IQuery
接口(interface)。通常我将它放在 DataAccess
程序集中。例如:
public interface IUserQuery
{
bool ContainsEMail(string emailAddress);
int NumberOfAdminisitrators();
DataRow Profile(Guid id);
DataTable FriendRequests(Guid id);
SomeReadModel ForSomethingThatContainsSayAList(DateTime date);
}
您会注意到我尽可能使用简单类型和技术特定的数据访问对象,如 DataRow
、DataTable
、never DataSet
:) --- 尽管 DataSet
可能 用于复合数据,但它有点麻烦。
我尝试将特定读取模型 (DTO) 保持在最低限度,但有时在处理复合数据时可能需要它们。
关于domain-driven-design - 关于 ReadModels 和域的 DDD/CQRS 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140455/