2017-04-13 11 views
0

特定のドメインに対応する文字列パーサーは、ユーティリティまたはドメイン/値オブジェクトと見なす必要がありますか?dddでの特定の機能の設計

例:ユーザーが金融商品の検索リクエストを送信します。たとえば、「OMX KRエクイティ」このような文字列をプロバイダに送信するには、解析してその正確な値(楽器名、市場コード、楽器の種類)にマッピングする必要があります。検索要求ファイルの構造は機器の種類によって異なるため、文字列が解析された後で、機器のタイプをデータベースの既存のタイプと照合する必要があります。存在しない場合、検索要求を提出することはできず、ユーザーはそれに応じて応答を受け取る必要があります。

(ユーザーが検索リクエストを送信すると、アプリケーションがリクエストファイルを生成してFTP経由で外部プロバイダに検索リクエストを送信します)時間リクエストが満たされてからフェッチされてからFTPに保存され、データベースに保存されるので、検索要求に対して即座に応答はありません。)

このロジックを配置する適切な場所を見つけることはできません。通常、SearchRequestエンティティ内の値オブジェクトですが、データベースに対して検証する必要があるため、問題が発生します。

また、静的なソリ​​ューションの導入を避けようとしています。なぜなら、テストが難しくなると思われるからです。特にドメインロジックとみなされている場合は、ユーティリティ、ヘルパーなどの静的メソッドに属するべきだとは思わない。

dddによると、この問題を解決する正しい方法は何でしょうか?

+0

通常、検索でドメインモデルが変更されないため、計測器のタイプを検証する必要がありますか? "Validate"は、 "この楽器がサポートされていない場合は何か他のことをする"という奇妙な方法です。 – VoiceOfUnreason

+0

詳細情報を含む質問を更新しました – DasBoot

+0

検索クエリの形式は、すべての検索プロバイダーの制約になりますか(それ以上の場合)、または現在のプロバイダー固有のものですか?おそらく、 'ISearchProvider {List validateQuery(String searchQuery)、...}'のようなインターフェースを持ち、それをインフラストラクチャに実装しています。 'ISearchProvider'と' SearchQueryError'は、ドメインやアプリケーションサービス層で定義することができます(どこが最適かはわかりません)。 – plalx

答えて

1

特定のドメインにcorespondsストリングパーサは ユーティリティまたはドメイン/値の対象として考慮されるべきですか?

それはコンストラクタでフォーマットを検証しますValue objectでなければなりません(正規表現を使用して、たとえば:[A-Z]{3}\s[A-Z]{2}\s[a-zA-Z]{1,})、それは、この文字列の三つの部分のための3つだけのゲッターがあります:getName():stringgetType():stringgetCode():stringを。このクラスの名前をInstrumentQueryにします。 only one responsability:文字列を検証+解析します。

検索要求ファイル構造は、機器の種類に依存するため、 文字列が解析されます後に楽器の種類は、データベース内の 既存のタイプと照合する必要があります。

は、「データベース内の既存の型と照合」 SearchRequest aggregateにコマンドをディスパッチする前に、検索コマンドを受信 Application serviceで行われます。ワイドワールドの既存のドメインのほとんどでは、何らかの種類の query methodが検索されますが、 SearchRequestAggregateです。この集約は submitQuery(InstrumentQuery instrumentQuery) command methodです。

デザインによっては、InstrumentTypeEntityIDです)またはValue objectです。 Entityの場合、submitQueryIDを受け取ることがあります。それは内部使用に依存します。いずれにしても、コマンドがSearchRequestAggregateに達する前に、その存在がRepositoryからロードしようとすることによってチェックされます。特に

それはドメインロジックと見なされた場合、私はそれが あなたが見ることができるように、2つの異なる検証を持って

などのヘルパー、ユーティリティとしての静的メソッドに属しているか、必要があると思ういけません。

  1. SearchRequestのフォーマット:純粋ドメインロジックは、ドメインコード層の内部に、内部ValueObject留まります。
  2. InstrumentType:アプリケーション層ロジックの存在。リポジトリからロードしようとするとチェックされます。
+0

私は一般的な考え方が好きですが、SearchQueryの値オブジェクトに関する質問があります。私は例外が、コンストラクタで特にfalse状態のドメインオブジェクト(nullのチェックなど)を作成しないようにするための手段として使用されていることに気付きました。しかし、私はこれらの例外がキャッチされていることを見たことはありません。あなたがそうしなければならない場合、それは良いアプローチのようには見えません。この種の例外は開発者の公開APIの一部であると言うのは正しいでしょうか?私は、値オブジェクトにIsValidプロパティを導入し、さらに進める前にそれをチェックすることを選択肢と考えています。 – DasBoot

+0

@DasBoot「ハッピー・パス」をより明確にするので、無効なデータの場合には、「ハッピー・パス」を放棄するために例外を投げているのが大好きです。そして、はい、パブリックAPIは、これらの例外をファースト・クラスの市民として含めるべきです。代わりに、 'isValid'メソッドは、' getters'と 'isValid'の間に一時的な結合を作り出すので最適ではありません。**オブジェクトを使う前に** isValidを呼び出す必要があります**。 –

+0

通常、オブジェクトのインスタンス化をtry catch節でラップするか、一番上のレイヤーで特定のドメイン例外をキャッチするだけですか?個人的には、ビジネス検証のケースでは例外を使用しません。あなたの答えを気に入ってください。 – DasBoot

関連する問題