我正在尝试通过 Unity 2.0 为双工 WCF 服务设置客户端。为此,我想将 CallbackContract - IUpdateClient
-的实现InstanceContext
插入到 中,然后将其插入到我的服务代理中,在本例中是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
(在配置中注册为“instanceContext”),并且在执行此操作时,它必须实例化注册为“updateClientImpl”的类型——事实上,它确实实现IUpdateClient
implementation
了——并将其作为参数传递给 InstanceContext 的构造函数.
尽管如此,我还是收到了上述错误。
总结(又名“tl;dr 版本”):当 Unity 容器解析 InstanceContext 时,它似乎没有正确创建其实现。我不知道这是否是配置错误,或者我是否从根本上误解了 Unity 容器如何解析一组依赖类型。对此的任何指导都会有所帮助。