0

Unity2.0を介してデュプレックスWCFサービス用にクライアントをセットアップしようとしています。そのためには、CallbackContract ---の実装をに挿入しますIUpdateClientInstanceContextこれは、サービスプロキシ(この場合は、DuplexClientBase<IUpdateService>呼び出されたのサブクラス)に挿入されUpdateProxyます。

私が遭遇する問題は、Unityコンテナに格納されているプロキシを使用してクライアントをサービスからの更新にサブスクライブしようとすると、次の例外が発生することです。

ChannelFactoryに提供されるInstanceContextには、CallbackContractType'..Services..ServiceContracts.IUpdateClient'を実装しないUserObjectが含まれています。

私は次のようにプロキシにアクセスしています:

_container.Resolve<IUpdateService>("updateServiceImpl").Subscribe();

私のUnity構成を考えると:

<!-- Interface to implementation mappings -->
<register type="RepositoryInterface" mapTo="Repository" name="repositoryImpl">
  <constructor>
    <param name="proxy" dependencyName="proxyImpl"/>
  </constructor>
</register>

<!-- Here's the bit that doesn't seem to be resolving as expected -->
<register type="UpdateClientInterface" mapTo="UpdateClient" name="updateClientImpl">
  <lifetime type="singleton"/>
  <constructor>
    <param name="repository" dependencyName="repositoryImpl"/>
  </constructor>
</register>      
<register type="System.ServiceModel.InstanceContext, System.ServiceModel, 
Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="instanceContext">
  <constructor>
    <param name="implementation" dependencyName="updateClientImpl"/>
  </constructor>
</register>

<!-- This is the type I'm resolving with the above _container.Resolve() statement -->
<register type="UpdateServiceInterface" mapTo="UpdateService" name="updateServiceImpl">
  <constructor>
    <param name="callbackInstance" dependencyName="instanceContext"/>
  </constructor>
</register>

<register type="ProxyInterface" mapTo="Proxy" name="proxyImpl">
  <constructor>
    <param name="configurationName">
      <value value="ServiceEndpointFromAppConfig"/>
    </param>
  </constructor>
</register>

UpdateServiceクラスを解決すると、次のようになります。

public class UpdateProxy : DuplexClientBase<IUpdateService>, IUpdateService
{
    public UpdateProxy(InstanceContext callbackInstance) 
        : base(callbackInstance) {}

    public void Subscribe() {}

    [...]
}

UnityコンテナはInstanceContext(configで「instanceContext」として登録されている)をインスタンス化し、その際、「updateClientImpl」として登録されている型をインスタンス化する必要があります。これは実際には実装さIUpdateClientimplementationれており、それをパラメータとしてInstanceContextのコンストラクタに渡します。 。

それでも、上記のようなエラーが発生します。

まとめ(別名「tl; drバージョン」): UnityコンテナがInstanceContextを解決するとき、実装が正しく作成されていないようです。これが構成のエラーなのか、それともUnityコンテナーが一連の依存型を解決する方法を根本的に誤解しているのかはわかりません。これに関するガイダンスは役に立ちます。

4

1 に答える 1

0

発生している問題は、InstanceContext を名前で登録したためです。ただし、UpdateProxy 型はまったく登録されていません。つまり、コンテナーはデフォルトの名前のない登録を使用して InstanceContext を解決しようとします。

ただし、デフォルトの登録がないため、デフォルトが有効になり、別のコンストラクターを選択しているように見えます。

修正は、UpdateProxy を登録し、その登録を InstanceContext の名前付き登録を使用するように設定するか、InstanceContext の登録から名前を削除することです。

于 2010-11-26T23:24:22.777 に答える