2016-07-28 3 views
2

現在、CQS形式のDDDアプリケーションを構築中です。私は、すべての「コンポーネント」が互いにどのように機能するかに疑問を呈しています。
アプリケーションの構造と通信の方向に関する疑問

しかし、最初に、私は、アプリケーションの構造について簡単に説明あげる:

ApplicationService 
    -> Receives command objects 
    -> doesn't return any results 
    -> Acts on Domain model 
    -> Speaks with Aggregate repository for domain modifications 

QueryService 
    -> Bypasses domain model; doesn't speak with Aggregate Repositories 
    -> Executes queries against database to populate view 
    -> Returns 'Representation' objects 

REST Controller 
    -> Receives HTTP requests and binds 'body content' & request params to Command objects 
    -> delegates to ApplicationService for POST, PUT & DELETE requests 
    -> Always returns at least some HTTP code 
    -> delegates to QueryService for GET requests 

Infrastructure 
-> Handles persistence to DB 
-> Contains some scheduling operations 
-> Handles foreign domain events our domain model is 'interested' in 

'Open Host' 
    -> This is mainly a Facade to be used by other domains 
    -> Facade delegates methods to ApplicationService for domain modifications and to QueryService for data retrieval (bypassing Repositories) 


私の質問:

  1. はそれがDomainEventHandlerはOK Repositoryに対応し、いくつかを呼び出すことです方法についてはAggregate?または、常にApplicationServiceに対応する必要がありますか?
  2. QueryServiceは、 'Representation'オブジェクトを返します。これらはUIで使用され、戻り値として'Open Host' Facadeが使用されます。それはOKですか?これらのオブジェクトは戻り値としてFacadeによって再利用されますか?またはFacade自分のオブジェクトを作成する必要があります、結果は基本的に同じですか?
  3. ApplicationServiceは入力パラメータとして 'Commands'をとります。でも、CommandsOpen Host Facadeでも使われていますか?またはFacadeはプリミティブ値のみを受け入れ、ApplicationServiceに委譲するときにCommandsに変換する必要がありますか?
  4. DomainEventHandlersは、 'Infrastructure'層にあるようです。 ApplicationServiceまたはDomain ServiceDomain Eventにサブスクライブできますか?またはこれは常にInfrastructureの責任ですか?

すべてのアドバイスは大歓迎です!

答えて

2

DomainEventHandlerがリポジトリに対応し、集約でいくつかのメソッドを呼び出すことはできますか?それとも、常にApplicationServiceに対応する必要がありますか?

私の経験では、ハンドラはアプリケーションサービスです。

QueryServiceは 'Representation'オブジェクトを返します。これらはUIで使用され、戻り値として 'Open Host' Facadeによって使用されます。それは正常ですか?これらのオブジェクトはファサードの戻り値として再利用されますか?またはFacadeは独自のオブジェクトを作成する必要があります。結果は基本的に同じですか?

オープンホストサービスとアプリケーションサービスの違いについて議論hereたくさんがあります。誰がオープンホストサービスを使用するのか、なぜそれが存在するのかはわかりません。

ApplicationServiceは「コマンド」を入力パラメータとして使用します。 OKですか?これらのコマンドはOpen Host Facadeでも使用されていますか?または、ファサードは、プリミティブ値のみを受け入れ、ApplicationServiceに委譲するときにコマンドに変換する必要がありますか?

私は、アプリケーションの端にプリミティブに渡し、その後

DomainEventHandlersは、「インフラストラクチャ」層上に存在するように見えるアプリケーションサービスで処理されたコマンドに変換します。 ApplicationServiceまたはドメインサービスがドメインイベントにもサブスクライブすることは可能でしょうか?あるいは、これは常にインフラの責任ですか?

私はハンドラをアプリケーションサービスとみなしてきました。これは、ユーザーのケースを調整する責任があるものです。したがって、ユースケースは、「EventXが受信されたときに電子メールを送信し、データベースを更新する」ことがあります。この例では、おそらく "電子メールを送信するコード"と "データベースに保存するコード"はインフラストラクチャと考えられますが、ハンドラ自体はそうではありません。

public class ExampleHandler : IHandle<ExampleEvent> 
{ 
    private IRepository _repo; 
    private ISendEmails _emailer; 

    public ExampleHandler(Repository repo, ISendEmails emailer) 
    { 
     .... set the private fields.. 
    } 

    public void When(ExampleEvent event) 
    { 
     _emailer.Send(event.whatever); 
     _repo.Save(something); 
    } 
} 

正直言って、私は層の面では本当に考えていません - 私は六角形の建築様式を好んでいます。上記の例では、イベントハンドラに依存関係を注入してからビジネスを開始するだけです。

+0

返信いただきありがとうございます。オープンホストサービスについて - 私はこれを他のドメインで使用されるインターフェースとして実装しました。これは、クロスドメイン通信のための単一の「アクセスポイント」と考えることができます。私のApplicationServiceは内部的にしか呼び出されません。 – user2054927

+0

他のドメインはどのようにこれにアクセスしますか?インプロセスであるか、httpなどでですか?他のドメインで同じメッセージングインフラストラクチャを使用できるかどうかは、メッセージの公開や独自のメッセージへの反応です。このようにすればOpen Hostはまったく必要ないかもしれません。 – tomliversidge

+0

他のドメインには2つの可能性があります。または、非同期に公開されるドメインイベントに反応します。またはそれらはファサード(=オープンホスト)に対応してデータを取得するか、または何らかのプロセスを呼び出す。ファサードは現在、単純なメソッド呼び出しによって呼び出されています。しかし、将来、これはMicroServiceアーキテクチャに進化するときにRESTサービスになるでしょう。 – user2054927

関連する問題