4


2

WCFは、インターフェイスやコントラクトなどを使用して優れたデザインを推進します。 たとえば、私の場合、ICustomerMgmtBIZとIProductMgmtBizのように2セットのビジネス機能があるとします。 これら2つがServiceContractsであり、私はのようなインタフェースを持っているなら

IBusinessService:IProductMgmtBIZ、ICustomerMgmtBIZ

実装クラスBusinessService。 BusinessServiceクラスの実装が多すぎることがわかります。 これまで使用してきた回避策は、部分クラスを実装することです。

一言で言えば、WCFサービスは1つの実装と1つのサービス契約しか持つことができません。

2 Answer


3


いいえ、WCFサービスタイプ(ServiceBehavior属性で属性付けられているクラス)に複数のサービス契約を実装することは可能です。クラスに複数のインターフェイスを実装させるだけの問題です。 Visual Studioのテンプレートまたは他の種類のコードジェネレータを使用している場合、これはすぐには明らかにならない可能性があります。 ただし、1つのサービスタイプに複数のサービス契約インターフェイスを実装することはできますが、1つのサービスとして動作するためにサービス、この場合はシングルトン(?)が必要な場合はあまり役に立ちません。 IBusinessServiceは、すべての操作が同じ論理セッション(ASPX Webセッションと同様)で動作するように、1つのクライアントプロキシから呼び出し可能にするためにサービスのすべての機能を必要とすることを意味します。 そうでない場合は、契約インターフェースごとに個別のプロキシを自由に定義できますが、契約ごとに1つのエンドポイントをサポートする必要もあります。

実装のためにWCF ServiceHostインスタンスにのみ持つことができるという絶対的な要件はありますか? あなたの決定に影響を与えている要因は何ですか?

ちなみに、部分クラスはもう私を悩ませません。 コードを複数のファイルに分割するという考えは、今ではかなり自然に思えます。 たとえば、ServiceType.csにコアロジックを格納するだけでなく、ServiceType_IProductMgmtBiz.csやServiceType_ICustomerMgmtBIZ.csのようなファイルに部分クラスを格納することも十分に自然なことです。

最後に、次の質問が役に立つかもしれません…​ https://stackoverflow.com/questions/470726/wcf-and-interface-inheritance-is-this-a-terrible-thing-to-do/474439[WCFとInterface Inheritance - これはすごいことですか。


1


率直に言って、いや、いやいや。 回避策は最適ではなく、「IBlank」をマスターWCFインターフェイス(インターフェイスがIBlankから派生したもの)として使用することと、IProductMgmtBIZを実装する1つとICustomerMgmtBIZを実装する2つのエンドポイントを使用することを含みます。 私は自分の開発マシンを私の目の前に持っていません、これは他のいくつかのオーバーライドを含むかもしれません。 そのため、WCFレベルでは、2つのWCF ServiceHostを使用したくない限り、問題はありません(これは完全に合理的です)。

要するに、回避策は洗練されていません。 同じポートに異なる拡張子を持つ2つのWCFエンドポイントを設定する方が簡単です。