0

WCFとVisualStudio2008を使用して、大規模な分散アプリケーションを構築しています。WCFの経験はあまりないため、クライアントとサーバー間のWCF通信のプロトタイプ作成に時間を費やしています。サーバーサブシステム内のWCFサービスによってパラメーターまたはリターンタイプとして参照されるクラスは、生成されたコードを介してVisualStudioによってクライアントプロキシに「コピー」されることがわかりました。私が驚いたのは、これを行うと、VisualStudioがクラスの名前空間を変更することでした。たとえば、次のコードがあるとします。

namespace MyLibrary
{
    class MyClass
    {
        //...
    }
}

MyLibrary.dllそして、それをにコンパイルして、WCFサービスが参照することを想像してみてください。一部のWCFサービスはMyLibrary.MyClass、リターンタイプとして使用します。MyClass生成されたクライアントプロキシコードを見ると、自動的に利用可能であることがわかります(これはすばらしいです)が、MyLibrary名前空間ではなく、VisualStudioによって生成された名前空間にあります。

何百ものクラスが複数のアセンブリに分散された複雑なドメインオブジェクトモデルを計画しています。これが、VisualStudioが行うコード生成全体にどれだけうまく「移植」されるかを懸念しています。また、私たちが設計した名前空間のすべての優れた階層がおそらく失われるのではないかと心配しています。私たちの最初のビジョンは、このドメインオブジェクトモデルのクラスライブラリを作成し、サーバーとクライアントの両方でそれを削除することでした。しかし、WCFマジックは必要なクラスのコードを生成するように見えるので、クライアントに独自のライブラリをデプロイすると競合が発生することを想像します。

次に、2つの具体的な質問があります。

  • クライアントプロキシコードを生成するときに、Visual Studioが独自の名前空間スキームではなく元の名前空間スキームを使用するようにする方法はありますか?そうでない場合、これはクライアント上の「コピーされた」ライブラリのユーザビリティに影響しますか?
  • それでも、元のライブラリをクライアントにデプロイできますか?私は想像していませんが、それはどのような衝突を引き起こすでしょうか?

ありがとうございました。

4

3 に答える 3

1

サービス参照を追加するときは、[詳細]ボタンをクリックできます。そこで、[参照されたアセンブリでタイプを再利用する]チェックボックスをオンにできます。また、クライアントプロジェクトで参照されている元の型を含むアセンブリがあることを確認する必要があります。

もちろん、元のライブラリをクライアントにデプロイすることもできます。

WCFがこれを行う理由-概念は、元のバイナリを持たない、または.net(Javaなど)をサポートしていないクライアントによってサービスが消費される可能性があるためです-したがって、サービス境界はクライアントが必要とするすべてのものを公開しますそれを呼び出し、その応答に対処するために。

于 2013-02-18T13:54:20.797 に答える
1

非常に大規模で古いプロジェクトにWCFを実装した最近の経験から、ペストのようなVisual Studioテンプレート機能(大規模プロジェクトの場合)は避けたいと思います。これは、将来的に頭痛や幻想的な問題を引き起こすだけです。

http://www.codeproject.com/Articles/114139/WCF-The-Right-Way-A-Quick-Reference-Guide

その記事をチェックしてください。それはあなたの現在の質問に答え、おそらく将来の多くの頭痛を防ぐでしょう。

上記に加えて、トランスポート層の適切な実装と分離があれば、コンポーネントを完全に再利用できます。これは、VSテンプレートを使用しない大きな理由です。

于 2013-02-18T14:12:03.920 に答える
0

あなたの最初のビジョンは完全に可能です。ビジュアルスタジオで生成されたクライアントを回避する方法は、ライブラリサービスインターフェイスをサーバーと共有する汎用クライアントを作成することと、バインディングの実装です(後者は必須ではありませんが、同一のサーバーで実行できます/ app.configのクライアントバインディング構成ですが、最終的な設定が類似している場合は便利です)。

アイデアを得るためのクライアント側のc#サンプルコード:

        // simplified extract from a generic service client lib, 
        // needs error mgmt channel disposal etc but the concept is there

        // BindingFactory is our common implementation with server, 
        // bindingType is an enumeration, this could be built from 
        // configuration though or however you want
        var binding = BindingFactory.CreateBinding(bindingType);

        var endpointAddress = new EndpointAddress(serviceAddress,
                     EndpointIdentity.CreateSpnIdentity(string.Empty))
        var channelFactory = new ChannelFactory<IMyLibrary>(
            binding, endpointAddress);

        var channel = channelFactory.CreateChannel();

        // IMyLibrary is the interface implemented 
        // by the service found on serviceAdress
        var result = ((IMyLibrary)channel).MyServiceFunction();
于 2013-02-18T18:18:24.093 に答える