Unity无法正确解析WCF InstanceContext实现

时间:2010-11-26 18:12:38

标签: wcf unity-container wcf-callbacks

我正在尝试通过Unity 2.0为双工WCF服务设置客户端。为此,我想将我的CallbackContract的实现 - IUpdateClient - 插入到InstanceContext中,然后将其插入到我的服务代理中,在这种情况下,DuplexClientBase<IUpdateService>的子类称为{ {1}}。

我遇到的问题是,当我尝试使用存储在我的Unity容器中的代理来订阅客户端来获取服务的更新时,我收到以下异常:

  

提供给的InstanceContext   ChannelFactory包含一个UserObject   没有实现的   CallbackContractType   '..Services..ServiceContracts.IUpdateClient'。

我正在访问代理:

UpdateProxy

鉴于我的Unity配置:

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

我希望当我解析UpdateService类时,可以看到:

<!-- 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>

Unity容器实例化public class UpdateProxy : DuplexClientBase<IUpdateService>, IUpdateService { public UpdateProxy(InstanceContext callbackInstance) : base(callbackInstance) {} public void Subscribe() {} [...] } (在config中注册为“instanceContext”),并且在执行此操作时,它必须实例化注册为“updateClientImpl”的类型 - 实际上实现了InstanceContext - 并将其作为IUpdateClient参数传递给InstanceContext的构造函数。

尽管如此,我收到上述错误。

摘要(又名“tl; dr版本”):当Unity容器解析InstanceContext时,它似乎无法正确创建其实现。我不知道这是配置错误,还是我从根本上误解了Unity容器如何解析一组依赖类型。任何有关这方面的指导都会有所帮助。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为您使用名称注册了InstanceContext。但是,UpdateProxy类型根本没有注册。所以正在发生的事情是容器将尝试使用默认的未命名注册来解析InstanceContext。

但是,由于没有默认注册,默认值会启动,看起来它正在选择不同的构造函数。

修复方法是注册UpdateProxy并将该注册设置为使用InstanceContext的命名注册,或者从InstanceContext的注册中删除该名称。