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 つの異なる fieldTypes があります。だから私の質問は、フィールドをクリーンアップするロジックをどこに置くべきか

  1. 各フィールドを別々にクリーニングするifステートメントを持つ外部の「サービス」に入れますか? (貧血モデル)
  2. フィールド値オブジェクト自体にクリーニングのロジックを入れて、各フィールドがそれ自体をクリーニングする方法を知っているか (これの問題は、フィールド オブジェクトがドメインに存在し、ドメイン内のデータをクリーニングするロジックを保持する必要があるとは思わないことです) 、ドメインはクリーンなデータのみを扱います)
  3. クリーニング (テキストの BLOB からフィールドを抽出する) を行う特別なクラスを ACL に作成しますか?

そして、このすべてのロジックが 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 に答える