1

我正在编写 WCF 客户端/服务。该服务可以执行一些长时间的操作,所以我添加了一个回调合约IProgressCallback。我正在开发的系统必须在各种环境中运行,所以我怀疑我会遇到无法打开回调通道的环境(我可能在这里错了)。

所以要小心,我已经像这样定义了操作合同。

[ServiceContract()]
interface IContract
{ ... }

[ServiceContract(CallbackContract = typeof(IProgress))]
interface IDuplexContract : IContract
{ ... }

这在服务器端非常有用。我可以轻松地配置服务以使用任一合同。

然而,问题出现在客户端。我手动定义了 2 个代理

public class ContractProxy 
   : ClientBase<IContract>, IContract
{ ... }

public class DuplexContractProxy 
   : DuplexClientBase<IDuplexContract>, IDuplexContract 
{ ... }

同样,两个代理都可以正常工作。

现在我有一个代理工厂,负责创建正确的代理。它可以很容易地找出要实例化哪个代理,但是当我尝试返回代理时出现了我的问题。

用户需要至少返回一个对象,IContractICommunicationObject我无法找到要返回的对象。我尝试了以下方法:

IContract CreateProxy(...)  // The user lacks access to Open, Abort, Close, etc.
ClientBase<IContract> CreateProxy(...)  // DuplexClientBase derives from ClientBase but the generic parameter is different and it isn't covariant so this cannot be done.

// First define a generic interface and then make both proxies implement it.
IProxy<TContract> : TContract, ICommunicationObject  // TContract cannot be restricted to an interface so I cannot make IProxy derive from TContract

目前作为一种解决方法,我只是返回 IContract 接口,但是使用代理的每个人都必须首先将其转换为 ICommunicationObject 以打开代理等。

这里有没有人有更好的方法来做到这一点,或者我只是过度担心双工通信在某些环境中可能不起作用?

4

0 回答 0