2016-10-03 6 views
3

Visual Studioは、次の2つのテンプレート(簡潔にするために私によって除去ネームスペースとコメント)を作成し、プロジェクトに新しいWCFサービスを追加:YAGNIWCFでインターフェイスと実装を分離する必要がありますか?

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    void DoWork(); 
} 

public class MyService : IMyService 
{ 
    public void DoWork() 
    { 
    } 
} 

を、私は通常、すぐに

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    void DoWork() 
    { 
    } 
} 
にそれを簡素化

このインターフェイスを実装するクラスは常に1つしかなく、には明らかな利点はありません。はすべてを2回入力します。奇妙な予期せぬ理由により、将来別の実装がある場合(または2つのサービスに同じクラスを使用したい場合)、必要なときにいつでもインタフェースを抽出できます。結局のところ、私の外部の世界との契約はWSDLであり、私のコード内のインターフェースではありません。

ただし、Visual Studioで推奨されるベストプラクティスに反するとき、私は常に懐疑的だ、それゆえ私は、コミュニティをお願いしたいと思います:

は、インタフェースとクラスを分割するいくつか明白な利点がありますWCFサービスの先頭から私は行方不明ですか?

+4

答えとしてポストしてください:**テスト**。インターフェイスを模擬するのはかなり簡単です。基本クラスを模擬する(インターフェイスが空ではない限り)、もっと難しいかもしれません。 VS IDEが私のためにすべてのタイピング作業をすることを考えると、私は通常、最初からインターフェイスを持っています。 –

+0

@AdrianoRepetti:WCFサーバーでは、サービスを嘲笑するという点はありません(サービスはテストしたいものなので)。 WCFクライアント(つまりサービスコンシューマ)では、WCFクライアントが自動生成プロキシクラスを使用するため、* server *が内部的にインターフェイスを使用するかどうかに違いはありません。 @ Heinzi kind ofの – Heinzi

+0

。 IMOそれはあなたのサービスをテストする方法に依存します。 _私が_しているのは、できるだけ実装クラスのビューをテストすることです(なぜなら...公開したくないからです)。インターフェイステストのために、私は2つのステップに進みます:インスタンスとテスト全体的なロジック(たとえばワークフローなど)をテストし、すべてのクラスがサービス境界を通じて適切にシリアル化されているかどうかをテストするサービスインスタンス(明らかにローカルにホストされます)を取得します。 –

答えて

3

WCFでインターフェイスと実装を分離する必要がありますか?

はい。

...があります。は、明示的なメリットがありません。 2度入力してください。

クライアントがサービスの実装を模擬する機能(Adrianoがコメントで呼び出した機能)に加えて、コンシューマーはサービスを呼び出す完全な運用チャネルを構築することができますインタフェース型の定義などは何もありません。

実際には、コンシューマがサービスを呼び出すのはgenerally accepted this is a superior wayです。 「サービス参照の追加」機能は複雑なものであり、あなたとサービスの間に別のレイヤーが追加され、サービス定義が変更されると難しくなります。

インターフェイスを実装に結合していれば、コンシューマーはサービスを完全に消費することができず、WSDL +プロキシ生成のビジュアルスタジオ混乱を余儀なくされます。決定的な契約は、実際にcreatemoreproblems解決することができます。

また、(ソープではなく)純粋なHTTPで操作を公開すると、分離の利点がさらに大きくなります。この例では、コンシューマはサービス参照を追加できないため、サービス定義タイプを提供することに完全に依存しています(または少なくとも何らかのスキーマがあります。インタフェースを分離したときに維持する方がずっと簡単です)でる)。 tenets of SOA状態

サービスを共有スキーマ&契約ではなく、クラスの

テネット3。

これは単なる比喩的ではなく、規範的です。サービスの内部実装をその表面に露出されているものから切り離す必要があります。

+1

私は同意見ですが、同じ実装が同じサービスを複数提供するかもしれないことに言及したいと思います(悪い、私は知っていますが、それは起こります)。 –

関連する問題