1

私は Reporting Services と Sharepoint を使用しています。レポート サービスを利用するアプリケーションを持っていますが、クライアントは私たちのアプリケーションを SharePoint に統合したいと考えています。現在、操作を実行するためのさまざまなメソッドを公開する ReportService.asmx Web サービスに密接に結合されています。Reporting Services には「Sharepoint 統合モード」と呼ばれるものがあり、有効にすると、レポート サーバーの動作が異なり、Sharepoint を使用してレポートを管理します。Sharepoint は、ほぼ同じ ReportService2006.asm という新しい Web サービスを追加します。

ここで、アプリケーションは ReportService への Web 参照を使用し、サービスによって公開されるさまざまなオブジェクトを使用します。ReportService2006 にはまったく同じオブジェクトがありますが、それらは明らかに異なる名前空間にあります。たとえば、2 つの Web 参照があります。各サービスに 1 つずつあり、オブジェクト MyApplication.ReportService.CatalogItem と別の MyApplication.ReportService2006.CatalogItem があります。

依存性注入を使用して、サービスをアプリケーションから抽象化し、ファクトリ パターンと組み合わせて、インターフェイスのどの実装をインスタンス化するかを決定しようとしました。これが私のインターフェースです。このアプリケーションに必要な呼び出しのみを含めるように簡略化しました。

using System;
using NetworkUserEncrypt.ReportService;

namespace MyApplication.Service
{
    public interface IReportingService
    {
        CatalogItem CreateDataSource(string DataSource, string Parent, bool Overwrite, DataSourceDefinition Definition, Property[] Properties);

        void DeleteItem(string Item);

        DataSourceDefinition GetDataSourceContents(string DataSource);

        byte[] GetReportDefinition(string Report);

        CatalogItem[] ListChildren(string Item);
    }
}

したがって、それぞれが異なる Web サービスをインスタンス化する 2 つの実装があります。

namespace MyApp.Service.Implementation
{
    class ReportingServiceImpl : IReportingService
    {
        ReportingService _service = null;

        public ReportingServiceImpl()
        {
            ReportingService _service = new ReportingService();
        }

        /* SNIP */
    }
  }

namespace MyApp.Service.Implementation
{
    class ReportingService2006Impl : IReportingService
    {
        ReportingService2006 _service = null;

        public ReportingService2006Impl()
        {
            ReportingService2006 _service = new ReportingService2006();
        }

        /* SNIP */
    }
  }

したがって、これらを実行時に ServiceWrapper に挿入できるようにする計画です。ただし、インターフェイスが ReportService に関連付けられており、一部のメソッドが Web 参照 (CatalogItem など) からのオブジェクトを返すことに気付いた場合。したがって、ReportService2006 の実装が別の名前空間から CatalogItem を参照しているため、私のプロジェクトはビルドされません。

何か案は?私はこれで完全に間違った方向に進んでいますか?

4

5 に答える 5

1

Web サービスが異なる名前空間に存在する場合、簡単な解決策はありません (たとえば、URL を変更するだけの簡単な方法)。ただし、抽象化で正しい軌道に乗っているようです。

ただし、冒険したい場合は、生成された Web サービス クラス ("reference.cs" ファイル) を自分で変更し、手動でプロジェクトに追加することができます。最初に共通のインターフェイスを作成し、次にファイルの最初の行を次のように変更します。

public partial class MyWebService : SoapHttpClientProtocol, IMyWebService

次に、これを使用してコードを呼び出します。

IMyWebService webService = new MyWebService();  // Or you can use a Factory
于 2008-09-26T14:18:23.363 に答える
1

VS2008 で ServiceReference を Web サービスに追加しようとすると、詳細ボタンが表示されます。それをクリックすると、「タイプを再利用する」オプションがあります。

于 2008-09-26T14:19:23.160 に答える
1

この状況では、あなたは正しい方向に向かっていると思います。家に帰るには、かなりの労力が必要です。リフレクションまたは動的メソッドを使用して、両方のバージョンのクラスをラップできるプロキシ クラスをいくつか作成します。また、remoting 名前空間のプロキシ クラスを使用して、実行時にメソッド呼び出しをインターセプトし、適切な場所に誘導する人も見てきました。これにより、手作業でコーディングする代わりに、必要に応じて動的メソッドを作成することができます。オブジェクトのインターフェースと一致するインターフェースです。

于 2008-09-26T14:08:32.170 に答える
1

必要な参照を追加するか、CatalogItem と残りの特定のクラスのラッパーを作成します。私はラッパーを構築します。インターフェイスは、特定の実装を参照せずに自立できるはずです。

于 2008-09-26T14:10:07.817 に答える
1

最も堅牢なソリューションは、CatalogItem インターフェイスを作成し、Web サービスごとにラッパーを作成して、すべてをファクトリの背後に隠すことです。ファクトリには「正しい」Web サービスを呼び出すためのロジックが含まれ、インターフェイスを使用するにはクライアント コードを変更する必要がありますが、これは改善のための変更です。

WCF は、これらの問題のほとんどをサービス コントラクトで解決します。私の以前のアドバイスがあまりにも扱いにくいと判明した場合は、WCF ソリューションへの移行を検討できます。

于 2008-09-26T16:03:49.837 に答える