我一直在阅读 Greg Young 和 Udi Dahan 关于 Command Query Responsibilty Separation 的想法,我读到的很多内容都引起了我的共鸣。我的域(我们跟踪正在交付的车辆)具有包含一个或多个停靠点的路线的概念。我需要我的客户能够通过调用 Web 服务在我们的系统中进行设置,然后能够检索有关路线和车辆行驶情况的信息。
在过去,我会拥有与我的域类非常相似的“缩减”DTO 类,客户将创建一个带有 StopDto 数组的 RouteDto,并调用我们的 CreateRoute 网络方法,传入 RouteDto。当他们通过调用 GetRouteDetails 方法查询我们的系统时,我会返回完全相同的对象给他们。CQRS 吸引人的方面之一是 RouteDto 可能具有客户想要查询的各种属性,但在创建 Route 时没有业务设置。因此,我创建了一个单独的 CreateRouteRequest 类,该类在调用 CreateRoute“命令”时传入,以及一个作为查询结果返回的 Route DTO 类。
class Route{
string Reference;
List<Stop> Stops;
}
但我需要我的客户在创建路线时向我提供路线和停靠点详细信息。在我看来,我也可以...
给我的 CreateRouteRequest 类一个 Stops(s) 属性,它是一个“东西”数组,代表他们需要提供的关于每个停靠点的数据 - 但我怎么称呼这个类?这不是一个停止,因为这就是我在我的 Route DTO 中调用 DTO 的列表,但我不喜欢“CreateStopRequest”。我还想知道我是否陷入了一种 CRUD 思维模式,考虑主从信息,并要求客户也这样想。
class CreateRouteRequest{
string Reference;
...
List<CreateStopRequest> Stops;
}
或者
他们调用 CreateRoute,然后多次调用 AddStopToRoute 方法。这感觉有点“行为”,但我将失去将创建包括其停靠点的路线视为单个原子命令的能力。如果他们创建了一个 Route,然后尝试添加一个由于某些验证问题而失败的 Stop,他们将有一个部分正确的 Route。
我无法为我将在选项 1 中使用的“StopCreationData”对象列表想出一个好名字,这让我想知道我是否遗漏了一些东西。