Webサービスアクセスとクライアントアプリケーションのビジネスレイヤーへの「直接」アクセスを簡単に切り替えるために、(WCFではなく)Web参照用に生成されたプロキシクラスに共通のインターフェイスを実装させる方法を探しています。
public IBusiness GetBusinessObject()
{
if (_mode = "remote")
return new BusinessWebService.Business(); // access through web service proxy class
else
return new Business(); // direct access
}
ただし、カスタムタイプ(CustomSerializableType
以下の例の例)は、生成されたプロキシクラスでは参照されません。代わりに、新しい同一の型が生成されるため、プロキシクラスがインターフェイスを実装できなくなります。
生成されたプロキシクラスにこれらのタイプを参照させる方法はありますか、それとも私はこれをすべて間違っていますか?代わりに、WebサービスをWCFサービスに変換することを検討する必要がありますか?
詳細
私たちのソリューションは、次の4つのプロジェクトで構成されています。
- ビジネスライブラリ(ビジネスロジックを含み、データストアにアクセスします)
- 共通ライブラリ(を含む共通機能を含む
CustomSerializableType
) - Webサービス(リモートクライアントとビジネスレイヤー間のプロキシとして機能します)
- Windowsアプリケーション
私たちのクライアントは、Windowsアプリケーションが2つの異なるモードで実行できることを望んでいます。
- ローカルモード。アプリケーションはビジネスライブラリを直接使用してデータにアクセスします。
- アプリケーションがWebサービスと通信してデータにアクセスするリモートモード
これを行うために、共通ライブラリにあり、すべてのビジネスメソッドを含むインターフェイスIBusinessを作成しました。
インターフェース
public interface IBusiness
{
CustomSerializableType DoSomeWork();
}
ビジネスレイヤー
public class Business : IBusiness
{
public CustomSerializableType DoSomeWork()
{
// access data store
}
}
ウェブサービス
public class WebServiceBusiness : IBusiness
{
private Business _business = new Business();
[WebMethod]
public CustomSerializableType DoSomeWork()
{
return _business.DoSomeWork();
}
}
生成されたプロキシクラス(読みやすくするために省略された大量のコード)
public partial class Business
: System.Web.Services.Protocols.SoapHttpClientProtocol
{
public CustomSerializableType DoSomeWork()
{
// ...
}
public partial class CustomSerializableType {
// PROBLEM: this new type is referenced, instead of the
// type in the common library
}
}