私は WCF に関しては経験が浅く、WCF サービスを簡単にモックする方法を本当に理解できません。
状況: クライアントとサーバーの両方が、サービスを定義するインターフェイスにアクセスできます。たとえば、次のようになります。
public interface ICustomerService
{
[OperationContract]
Customer GetCustomer(int id);
}
さて、私の最初の質問は、共有ライブラリでサービスを定義する同じインターフェイス タイプをクライアントとサーバーで共有したくない理由があるかどうかです。もちろん、サービスのコンシューマが .NET でない場合や、ライブラリを持たないサード パーティにサービスを公開する場合は、その可能性はまったくありませんが、可能性がある場合にそれを共有しても、それらを傷つけることはありません。他のシナリオですよね?
次に、それが悪い考えではない場合、実際に Visual Studio にサービス インターフェイスを再利用させるにはどうすればよいでしょうか? 共有アセンブリでも定義されている をCustomer
チェックすることで、型を共有することができましたが、それでもインターフェイスが再生成されます。Re-use types
しかし、これらの問題に関係なく、クライアントをモック可能にするにはどうすればよいでしょうか? VS で生成されたサービス参照を調べると、具体的な型が得られますが、コードでその型を直接参照したくないので、インターフェイスと対話したいと考えています。生成されたクライアントを として公開するとICustomerService
、これClose
は機能しますが、インターフェイスでメソッドが定義されていないため、メソッドがありません。
私はまた、次のアプローチを考え、自動生成クライアントを完全に放棄し、クライアントを自分で書くだけです。
public interface IServiceClient<T>
{
void Close();
T Services { get; }
}
public class CustomerServiceClient : ClientBase<ICustomerService>, ICustomerService, IServiceClient<ICustomerService>
{
public Customer GetCustomer(int id)
{
return base.Channel.GetCustomer(id);
}
public ICustomerService Services
{
get { return this; }
}
}
それは機能IServiceClient<ICustomerService>
し、IoC コンテナーとして公開することができますが、それが今であり、インターフェイスが変更さclient.Services.GetCustomer(1)
れたときにクライアントを簡単に再生成するという利点を失ったことに注意してください。ICustomerService
追加するのは簡単なコードですが、これを維持するのは面倒かもしれません。
別の可能性は、生成されたクラスが であるという事実を利用することですpartial
。これを行うときにも機能します。
interface ICloseable
{
void Close();
}
interface ClientInterface : ICustomerService, ICloseable
{
}
partial class CustomerServiceClient : IClientInterface
{
}
しかし、それは偽のクラスとインターフェイスを作成しました。これは災害ではありませんが、あまりきれいではありません。
いずれかのルートに進む前に、見落としている明らかなものはありますか?