0

系统描述: 系统基本上处理来自外部系统的消息。

我对系统建模的方式是: 1. 我创建了一个反腐败层,用于接收来自外部系统的消息(快速消息)。ACL 还负责清理数据,最后,ACL 将消息发送到域服务进行处理。2. 我有实际的域,可以处理这些消息,进行一些计算等。

我在弄清楚将“清理”快速消息中的数据的逻辑放在哪里时遇到问题。

Swift 消息: 每个 Swift 消息只是一个包含各种字段及其各自值的文本 BLOB

{
    :field1://value 1 ***
    :field2://value2!!
    :unwantedField3://value3
}

同样,我有一个名为 Message 的实体,其中包含一个字段列表。我面临的问题是将文本的 BLOB 转换为消息实体。这是因为每个字段的提取方式都需要与下一个不同。所以在上面的例子中,

  1. field1 的值必须是值 1,没有*
  2. field2 的值必须是值 2,没有 !!
  3. 字段 3 必须被忽略

总共有 4 种不同的 fieldType。所以我的问题是,我应该把清理字段的逻辑放在哪里

  1. 我是否将其放在具有 if 语句以不同方式清理每个字段的外部“服务”中?(贫血模型)
  2. 我是否将清理逻辑放在字段值对象本身中,所以每个字段都知道如何清理自己(问题是字段对象驻留在域中,我认为我不应该保留逻辑来清理域中的数据,域只处理干净的数据)
  3. 我是否在 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;}
}
4

1 回答 1

1

ACL 的目的是使数据完全适应域。它应该翻译/清理数据,因此域不需要知道其他系统的详细信息。因此,ACL 是清理的正确位置。但是,如果字段非常复杂,则可以在 ACL 中使用多个适配器类来处理字段特定的逻辑。只需确保数据在传递到您的域之前已完全翻译。

于 2013-04-07T15:42:08.670 回答