[ServiceContract]
WCF サービス用としてマークされているインターフェイスがいくつかあります。しかし、コード内の 2 つの異なる WCF 以外の場所でも使用されています。
[ServiceContract]
問題は、 WCF プロジェクトではないとマークされているインターフェイスを使用していることです。
コードを複製せずに、WCF コンテキストでのみ this 属性を使用する方法はありますか?
条件付きコンパイルディレクティブを使用できます。
#if WCF
[ServiceContract]
#endif
public interface ...
次に、WCFプロジェクトでWCFトークンのみを定義します。
WCF ではない場所で WCF コントラクト定義を使用しているのはなぜですか? インターフェイスが WCF 実装の詳細であるという事実。他のコードで WCF に関連しないインターフェイスを定義し、WCF と通信する必要がある場合は、WCF インターフェイスに転送するアダプターを記述します。
これの追加の利点は、WCF コントラクトへの変更が他のコードに影響を与える必要がないという点で分離境界を提供することです。
interface IFoo
{
void DoSomething();
}
[ServiceContract]
interface IWCFFoo
{
[OperationContract]
void DoSomething();
}
class FooAdapter : IFoo
{
IWCFFoo wrapped;
public FooAdapter(IWCFFoo wrapped)
{
this.wrapped = wrapped;
}
public void DoSomething()
{
wrapped.DoSomething();
}
}
また、IFoo と IWCFFoo で異なる型を使用できるため、DataContract DTO がコードの残りの部分に影響を与えません。