2010-12-21 21 views
4

私のドメイン駆動型デザインプロジェクトで外部の第三者Webサービスを消費したいのですが、どのレイヤーで外部Webサービスにアクセスする必要があるのか​​理解できません。ドメインサービスでは、ドメインサービスはドメインオブジェクト専用であるため、そうは思わない。しかし、私の要件は、私は外部Webサービスからの入力に基づいて操作のリストを実行する必要がある、私はドメインサービスで別のタスクを実行する必要があります。私は混乱しています。ドメイン駆動型デザインでの外部Webサービスの使用

+0

問題を解決するには多くの方法があり、常に意見の違いがあります。元の質問に詳細を追加する必要がありますか? DOが必要なときにデータにアクセスするようにしたいのですか、または他のトリガーによって提供されるデータですか?詳細をご記入ください。 –

答えて

1

私はいくつかの操作を実行するために外部Webサービスを使用する必要があると思います。運用のためにあなたのビジネスロジックを意味するなら、私はあなたのビジネスロジックレイヤーに適切な場所があると思います。あなたの文脈では、それらを使うだけでいいです。 製品価格を計算するために必要な場合は、VATを計算する外部DLLにどこに電話をかけますか?

は、私はあなたが何ができるか

5

は、ドメインのプロジェクトであなたのドメインモデルの観点から必要なサービスへのインタフェースを導入している:-)それは理にかなって願っています。ドメインのクラスがサービスを必要とするたびに、このインターフェイスの実装への参照を渡します。

次に、このインターフェイスを実装し、使用する必要があるWebサービスに接続する「コネクタ実装」を作成します。アプリケーションを起動するときには、依存関係注入フレームワークを使用するなど、この実装をドメインクラスに提供します。

このコネクタには、ドメインモデルとWebサービス定義への参照があります。ドメインモデルには、コネクタ実装またはWebサービスへの参照がありません。ドメインプロジェクトで定義されたインタフェースのみを認識します。これは制御の反転と呼ばれます。

このように、ドメインクラスはWebサービスについては何も知らず、ドメインモデルで定義したインターフェイスについてのみ認識します。したがって、あなたのドメインロジックは、外界の「悪」から分離されたままです。前に述べたように

1)、のDomainServiceのいくつかの並べ替えを表すインターフェイスを作成し、Webサービスを呼び出し、具体的な実装を行います。

2

私は選択肢のカップルがあると思います。

2)何かが起きたときにサービスを呼び出す必要がある場合のみ。注文が確定したら「ドメインイベント」を使用することができます(http://www.udidahan.com/2009/06/14/domain-events-salvation/を参照)

Order.Confirm()メソッドはOrderConfirmedイベントを発生させ、イベントに応答してそこからWebサービスを呼び出します。 イベントハンドラとサービス参照は、ドメインレイヤを消費するアプリケーションレイヤに存在できます。

3)ウェブサービスの結果がドメインの概念であると考えられる場合、結果のエンティティと、このエンティティをWebサービスの結果から創造するリポジトリを作成して、外部データ。

+0

実際に私は自分のアプリケーションのpaypal、authorize.netの支払い処理プログラムを作成したいと思います。私はそれを作成した、それはまた、IPaymentMethod、PaymentInfoのような実体をたくさん持っています。しかし、私は個別の集約を作成し、そこにすべてのエンティティを置いて、データでいっぱいのエンティティを取り出し、paypalまたはauthorize.netに渡してステータスメッセージを待つドメインサービスを作成するかどうかを判断できません。私がやること。支払い処理の部分は私のドメインの内部にあるのか、それとも結論できないのか。助けてください。 – chandra

+0

IMO、あなたのドメインクラスがpaypalとauthorize.netに依存していない限り、あなたが選んだソリューションはどれも問題ありません。だから、支払い処理があなたのドメインの一部であるということになります:もしそうなら、paypal/auth.netの実装で実現できる適切な抽象とインターフェースを選択してください。あなたが正しい軌道に乗っているように聞こえます。依存関係を正しく取得すればさらに多くのことができます。 – Marijn

4

外部Webサービスにアクセスするには、新しいアプリケーションサービスが必要です。前述のように、サービス実装をドメインオブジェクトに組み込むことができます。

の「Domain Driven Design」の105ページを参照してください。あるいは、私の答えhereを見て、DDD内のさまざまな種類のサービスを理解してください。

+1

アプリケーションサービスを作成してドメインオブジェクトに挿入するように指示しています。それは可能ですか?ドメインオブジェクトがアプリサービスにアクセスできるかどうか。どうやって ?他の人はドメインサービスで私に言います。ここで完全な混乱。 – chandra

+0

@ Vijay私のドメインでは、広告主と出版社のエンティティがあります。私は広告主の一部である残高に広告主が資金を入金できるようにしたいと思います(PayPalの移転ファンド、エンティティ。 PayPalは、さまざまなパラメータを必要とします。これは、さまざまなエンティティを作成しています。たとえば、 - PaymentInfoの場合、PayPalや支払いゲートウェイに渡します。だからどこに私のドメイン内のすべてのエンティティを置くのですか?支払い集計を作成し、転送またはアプリケーション層でドメインサービスを作成しますか? – chandra

関連する問題