システム全体で使用される既存のインターフェースがいくつかあります。
ここで、インターフェイスの 1 つをサービス コントラクトとして使用したいと考えています。
しかし、問題は、既存のインターフェイスに属性を追加する必要があり[ServiceContract]
、[OperationContract]
それらが残りのコードを汚染することです。
インターフェイスを複製せずにこの問題を解決する方法はありますか?
具体的な実装に属性を適用しますか? それは良い習慣ですか?
ありがとう
サービスワーパータイプのインターフェイスを使用してインターフェイスを拡張するだけで、次のようになります。
public interface IMyCode
{
string GetResult();
}
[ServiceContract]
public interface IMyCodeService : IMyCode
{
[OperationContract]
string GetResult();
}
IMyCodeService.GetResult
C#はインターフェースの継承を許可し、コンパイラーはメソッドを非表示にするためにnewを必要とする警告を吐き出しますが、例として、IMyCode.GetResult
追加new
しなくても実装が中断されることはありません。
class Program
{
static void Main(string[] args)
{
MyCodeService service = new MyCodeService();
IMyCodeService serviceContract = (IMyCodeService)service;
IMyCode codeContract = (IMyCode)service;
service.GetResult();
serviceContract.GetResult();
codeContract.GetResult();
Console.ReadKey();
}
}
public interface IMyCode
{
void GetResult();
}
public interface IMyCodeService : IMyCode
{
void GetResult();
}
public class MyCodeService : IMyCodeService
{
public void GetResult()
{
Console.Write("I am here");
}
}
これにより、既存のコードを変更することなく、既存のインターフェイスに基づいてサービス契約を提供できます。
WCFを使用してプロキシを生成する代わりに、コントラクトアセンブリを共有する場合は、サービスインターフェイスが継承するため、既存のインターフェイスを受け入れる場所でサービスコントラクトを渡すこともできます。
私たちはゆっくりと WCF に移行しようとしていますが、同じ問題が発生しました。Service インターフェースを属性で装飾する以外に、別の方法を見つけることができませんでした。それらは属性であるため、コードをそれほど汚染しないことを願っています。
私たちがしなければならなかったことの 1 つは (従来の Web サービスから移行する場合、Global.aspx と WCF Host Service の両方から呼び出せるように、すべての依存関係を共通の場所に移動することです)。
WCF ホストがホストできるように、具体的な実装 (主に ServiceBehavior 関連の属性) に属性を実装する必要があります。OperationContract に関しては、主にインターフェースに適用しました。