7

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
  }
}
4

1 に答える 1

6

クライアントのデフォルトの名前空間が「Client」で、Web 参照の名前が「Proxy」であると仮定すると、次のようになります。

  1. クライアント プロジェクトのルートに、"Proxy" という名前のフォルダーを作成します。
  2. そのフォルダーに、「Business」という名前のクラスを作成します。
  3. そのクラスを公開および部分的に作成し、IBusinessインターフェイスを実装します

この方法では、Reference.cs を変更する必要はありません。Reference.cs、またはコード生成によって生成されたその他のファイルを変更しないでください。

これは、クライアントをサービスに緊密にバインドすることにより、SOA の原則に違反していることに注意してください。少なくとも、クライアントとサービスの間で「インターフェイス」プロジェクトのみを共有するように、これらのインターフェイスを別のプロジェクトで定義する必要があります。

于 2010-09-30T19:07:48.743 に答える