2011-12-19 4 views
4

これは私がインタビューで尋ねられた質問です。WCFサービスは、抽象クラスの代わりにインターフェイスをサービス契約として使用するのはなぜですか?

WCFサービスを作成すると、2つのファイルが取得されます。 "IService.cs"と "Service.cs"。それは抽象クラスを継承するクラスとインターフェースを実装するクラスである理由は何ですか?抽象クラスに[servicecontract]属性を付けることはできないと言って返答しないでください。あなたはそれをインターフェイスにしか適用できないのは知っていますが、なぜですか?

答えて

6

複数のインターフェイスを実装できます。 1つは、抽象クラスを1つだけ継承できます。

+0

私はインタビューでそれを言ったが、wcfサービスで2つのサービス契約を実装することはほとんど考えられないと言った。 – fbhdev

+0

私は複数のサービス契約を言いませんでしたが(2つの契約が異なるセキュリティ要件を持っていることを私は見てきましたが)。私はどんな種類のインターフェースも意味していました。 –

+0

@ fahed。我々は、複数のインターフェイスを実装する複数のサービスを持っているので、それほど珍しいことではありません! – ChrisBint

6

WCFは、クライアントとサービスを完全に分離します。サービスの実装をサービスとして指定すると、クライアントはサービスに密接に結合します。私は考えることができる

1

いくつかの理由:意図の

  • 明確な声明 - 「API署名のこのセットは完全に任意の可能な実装から分離されています」。対照的に、抽象クラス(私の意見では)は、 "この基本クラスはこの派生クラスのセットで動作するように設計されています"という記述です。
  • さらにオープンな修正 - 一度基本クラスを継承すると、それだけです。 [ServiceContract]には実装がないので、あなたが持っている1つの継承スロットを無駄にするのはなぜですか?たとえば、すべてのサービスクラスは、[ServiceContract]インターフェイスの実装に加えて、共通のコンテキスト状態とメソッドを提供する抽象的なServiceBaseクラスを継承します。しかし、そうでない場合でも、将来の使用のために基本クラスのスロットを空けたままにしておきます。
  • 適切な場合、1つのサービスクラスで複数の[ServiceContract]を実装することができます。
  • [ServiceContract]を別のものから継承することに依存する厳密な契約バージョン管理システムを使用している場合、同じ継承ツリーにサービスクラスを追加すると、サービスクラスが破損します。
関連する問題