系统描述: 系统基本上处理来自外部系统的消息。
我对系统建模的方式是: 1. 我创建了一个反腐败层,用于接收来自外部系统的消息(快速消息)。ACL 还负责清理数据,最后,ACL 将消息发送到域服务进行处理。2. 我有实际的域,可以处理这些消息,进行一些计算等。
我在弄清楚将“清理”快速消息中的数据的逻辑放在哪里时遇到问题。
Swift 消息: 每个 Swift 消息只是一个包含各种字段及其各自值的文本 BLOB
{
:field1://value 1 ***
:field2://value2!!
:unwantedField3://value3
}
同样,我有一个名为 Message 的实体,其中包含一个字段列表。我面临的问题是将文本的 BLOB 转换为消息实体。这是因为每个字段的提取方式都需要与下一个不同。所以在上面的例子中,
- field1 的值必须是值 1,没有*,
- field2 的值必须是值 2,没有 !!
- 字段 3 必须被忽略
总共有 4 种不同的 fieldType。所以我的问题是,我应该把清理字段的逻辑放在哪里,
- 我是否将其放在具有 if 语句以不同方式清理每个字段的外部“服务”中?(贫血模型)
- 我是否将清理逻辑放在字段值对象本身中,所以每个字段都知道如何清理自己(问题是字段对象驻留在域中,我认为我不应该保留逻辑来清理域中的数据,域只处理干净的数据)
- 我是否在 ACL 中创建特殊类来进行清理(从文本 BLOB 中提取字段)
并且所有这些逻辑都位于 ACL 中还是移动到域中。我感觉清理外部数据的逻辑不能放在域中,因为它没有业务。
public class Message: Entity<long>
{
public IList<Field> Fields{get; set;}
}
public class Field: ValueObject
{
string Tag {get; set;} // this is what it looks for in the swift message BLOB of text from the external system
string Value {get;set;}
}