2

現在、アプリケーションには次のレイヤーがあります。

  1. API
  2. AppServiceレイヤー
  3. ドメインモデル
  4. リポジトリ

下位(2)層(ドメインとリポジトリ)は、ビジネスニーズ全体でほぼ完全に再利用できるため、少なくともドメインモデルをサービス(場合によってはWCFサービス)として公開することを考えました。基本的に、ドメインエンティティのデータ、動作、および永続性は再利用可能であり、これを一元的に公開する方法が必要です。

私は以下( WCFサービスとのドメインモデルの共有)と、WCFを介してドメインエンティティを直接公開しない理由を示す類似のものを読みました。ほとんどの例は、ドメインデータを公開するためのデータコントラクトを作成し、ドメインとDTO(データコントラクト)データの間でマッピングするためのマッピングメカニズムを備えていることを示しています。ここまでは順調ですね。

以下のようなメソッドがドメインレイヤーにある場合、新しいWCFサービスを介してそれを公開するにはどうすればよいですか?DTOのみを公開すると思ったので、プロセス間で再利用したい共有/共通ドメインの動作も公開するにはどうすればよいですか?

public int ProcessSomeRule(string param1, string param2)

答えが、プロキシとして機能するメソッドをWCFサービス上に作成することであり、それでもProcessSomeRuleメソッドを直接公開しない場合、私はそれでかっこいいですが、それは別の質問を引き起こします。この抽象化と、たとえばProcessSomeRuleWCF(string,string)内部で向きを変えてドメインメソッドを呼び出すという名前のWCFサービスでメソッドを作成する目的は、まだ結合されており、純粋な抽象化を提供していないようです。それでも署名の変更に敏感です。

メソッドを直接公開しないことで、コントラクトインターフェイスを変更せずに内部で変更を加えることができることを読みました。OK、これは定義上素晴らしいように聞こえますが、私の内部メソッドに追加のパラメーターが必要で、署名が `ProcessSomeRule(string、string、string)である場合、何を推測しますか?3番目のパラメーターが欠落しているため、コントラクトインターフェイスメソッドが機能しなくなります。そのため、インターフェイス変更する必要があります。これを行う方法がわからなくても、抽象化を価値のあるものにしますか?

同じように私のリポジトリは汎用的であり、プロセス間で使用できます。このレイヤーも再利用したいと思います。現在、私のリポジトリ(UoW)インターフェイスはAppServiceレイヤーに挿入されているため、リポジトリレイヤーがWCFサービスである場合にこれがどのように機能するかわかりません。

質問:ドメインレイヤーとリポジトリレイヤーの共有動作を公開するにはどうすればよいですか?また、これらの新しいレイヤーの名前は何と呼ばれますか?新しいレイヤーは「ドメインサービス」という名前のドメインを公開し、「AppService」と「DomainModel」の間に位置していますか?

最後に、私がこれのいずれかで間違った道を進んでいる場合は、遠慮なく私を戻してください。ありがとう!

4

2 に答える 2

1

ドメイン層とリポジトリ層の共有動作を公開するにはどうすればよいですか? また、これらの新しい層の名前は何と呼ばれますか?

六角形 (ポートとアダプター) アーキテクチャのコンテキストでは、ドメイン層はアプリケーション サービスによってカプセル化され、それによってアプリケーションのコアが定義されます。アプリケーション サービスは、集約サービスとドメイン サービスに委任し、リポジトリとインフラストラクチャ サービスへのアクセスを調整することで、ユース ケースを実装します。次に、アプリケーションをインフラストラクチャに「適応」させることができます。ドメイン層で宣言されたリポジトリ インターフェイスをリポジトリに実装させることは、この例です。リポジトリの実装は、ドメインと外部世界の間のアダプターとして機能します。同様に、通常オープン ホスト サービスと呼ばれる WCF サービスについても同様です。DDD では、アプリケーションをトランスポート インフラストラクチャに適合させます。WCF サービス (ASP.NET WebAPI サービス) は、アプリケーション サービスに委任する比較的薄いレイヤーです。繰り返しますが、このレイヤーの目的はアダプターとして機能することだけです。このレイヤーは、公開するコントラクトを所有しています。DDD では、これを公開言語と呼びます。たとえば、WCF では、DataContractおよびDataMember属性を介して定義されます。これらのコントラクトは、外部システムがドメインにアクセスする方法です。公開されたコントラクトと内部ドメインの間にバッファーを持つことは重要です。なぜなら、コントラクトはさまざまな速度で変更され、さまざまな消費者の要件を持つ可能性があるからです。

「Domain Service」という名前のドメインを公開し、「AppService」と「DomainModel」の間に位置する新しいレイヤーですか?

いいえ、ドメイン サービスはドメイン レイヤー自体の一部であり、エンティティ、集計、および値オブジェクトと共に存在します。

于 2013-02-27T18:26:01.413 に答える
0

ドメインオブジェクトをサービスとして公開することは難しくないと思います。しかし、システムは実際にはサービスと UI の組み合わせです。UI アクセス サービス、およびサービスはさまざまな方法で実装できます: DDD または database-central 。そのため、ビジネス ロジックをどのように実装するかをサービスの呼び出し元に伝えるのは得策ではありません。

于 2015-12-04T14:16:23.623 に答える