我有一个CQRS命令,如下所示
public sealed class RequestRoute
{
public RequestRoute(string fromAddressName, double fromLatitude, double fromLongitude, string toAddressName, double toLatitude, double toLongitude, string userId)
{
UserId = userId;
ToLongitude = toLongitude;
ToLatitude = toLatitude;
ToAddressName = toAddressName;
FromLongitude = fromLongitude;
FromLatitude = fromLatitude;
FromAddressName = fromAddressName;
}
public string FromAddressName { get; private set; }
public double FromLatitude { get; private set; }
public double FromLongitude { get; private set; }
public string ToAddressName { get; private set; }
public double ToLatitude { get; private set; }
public double ToLongitude { get; private set; }
public string UserId { get; private set; }
}我的程序员的直觉告诉我,我应该将FromXXX和ToXXX字段分解到一个名为"Address"...but的单独类中,我不确定这是否违反了CQRS模式……我见过的所有示例都只使用原始类型作为命令和事件的属性。
发布于 2013-04-09 17:48:48
在我看来,这样的重构没有真正的价值。
编写route.ToLatitude或route.To.Latitude在可读性和维护过程中都不会改变任何东西。
但是,我会将double 字段更改为decimal (甚至是to字符串),以避免在不同平台、机器或体系结构之间移动DTO序列化(无论是二进制还是非二进制)时出现任何问题。
发布于 2013-04-09 19:28:15
命令是面向数据的,而不是面向对象的。它的属性应该主要是基本类型。您在这里没有对任何东西进行建模,只是在到处发送平面数据。
使用自定义类型会强制您将类型发布到每个想要使用命令的客户端。它还将阻止您在将来更改这些类型,而不会遇到一些麻烦。
然后是可序列化:自定义类型越少越简单。
在像命令和事件这样的消息中,我会尽可能使用原语。这里不是复制的问题,你想要低耦合,可序列化,改变容错。
发布于 2013-04-09 10:45:35
就模式而言,在那里提取一个通用类型似乎很好。总体考虑是,命令一旦发出就不应该更改,因此只需确保address类型是不可变的(就像原始类型一样)。
可能需要考虑一些实现约束,即序列化。
https://stackoverflow.com/questions/15891143
复制相似问题