40

私の最初の質問なので、それが適切であることを願っています:

共有インターフェイス アセンブリ- インターフェイスを持つ「共有」アセンブリがあります。それを と呼びましょうIDocRepository。でマークされており、 でマークされたメソッド[ServiceContract]がいくつかあります。[OperationContract]

WCF 実装アセンブリ- 2 つの WCF サービス プロジェクトがあり、それぞれが共有アセンブリを参照し、それぞれがそのインターフェイスを WCF サービスとして実装しています。

コンシューマ アセンブリ- 最後に、2 つの WCF サービスのそれぞれを参照する共有アセンブリを参照する「クライアント」プロジェクトがあります。

ただし、コンシューマ アセンブリで生成されるサービス参照は、自動生成されたバージョンのインターフェイスから派生します。

public partial class ExampleClient : System.ServiceModel.ClientBase<SomeNamespace.ExampleSvcRef.IDocRepository>, SomeNamespace.ExampleSvcRef.IDocRepository {


が期待していたのは、両方の参照が代わりに定義したインターフェイスを自動的に継承し、コンシューマー/クライアント アセンブリも参照していることです。パラメーターと戻り値の型に提供されるクラスの再利用のようなものですが、サービス インターフェイス用です。

どちら
かのサービス参照プロキシのインスタンスを作成し、それをインターフェイス タイプにキャストできるようにするためです。

そのため、生成されたコードを毎回手動で変更できますが、もっと良い方法があるはずです...?

(編集:両方のサービス参照に対して「参照されたアセンブリでタイプを再利用する」オプションと「すべての参照されたアセンブリでタイプを再利用する」オプションが選択されています)

4

4 に答える 4

46

「参照されるアセンブリのタイプを再利用する」では、データコントラクトのみを再利用でき、サービスコントラクトは再利用できません。サービス契約を共有したい場合は、「サービス参照の追加」を使用する必要はまったくありません。ChannelFactoryを直接 使用できます。

// Supply the binding and address in code
Binding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://tempuri.org/address");
IServiceContract channel = ChannelFactory<IServiceContract>.CreateChannel(binding, address);

// Or read them from the config file
ChannelFactory<IServiceContract> channelFactory = new ChannelFactory<IServiceContract>();
IServiceContract channel = channelFactory.CreateChannel();

チャネルオブジェクトはICommunicationObjectも実装するため、Open()やClose()などのメソッドを呼び出す必要がある場合はキャストできます。

于 2010-06-25T22:54:11.917 に答える
3

サービス参照を作成するときに、共有定義を再利用するためにチェックを入れることができるボックスがあります。クライアント プロジェクトが既に共有アセンブリを参照していることを確認し、サービス参照を再度追加して、すべてのオプションを注意深く確認してください。

それでもうまくいかない場合は、使用しているバインディングを確認してください。基本的な HTTP バインディングは型の再利用をサポートしないという漠然とした記憶がありますか?

于 2010-06-25T15:37:01.003 に答える
2

プロキシジェネレーターを引き続き使用したい場合は、別の良いオプションがあります。これは、制限されていますが、ある程度便利な機能です...部分クラスを使用します。

namespace <same namespace as generated proxy>
{
    public partial class MyClient : <namespace of "real" service contract>.IServiceContract
    {
    }
}

プロキシが、サービス コントラクトで定義されているのと同じ方法でコードを生成していることを確認します。つまり、'List' を使用している場合は、サービス参照の構成でもそのオプションを使用します。つまり、生成されたサービス インターフェイスが実際のサービス インターフェイスと正確に等しく、上記のコードが機能することを確認し、参照を更新するには、コードを記述する代わりに右クリックを使用します。

于 2011-09-02T16:54:18.833 に答える