【发布时间】:2010-06-27 19:56:24
【问题描述】:
我有一个想法,但我需要帮助来实现它。
WCF 在其合同中不支持委托。 相反,它有一个繁琐的回调合约机制,我正在寻找一种方法来克服这个限制。
我考虑过使用IDataContractSurrogate 将合约中的每个委托替换为将被序列化到远程端点的令牌。在那里,令牌将被反序列化为生成的委托。此生成的委托将发送一个通用回调消息,该消息封装了所有参数(调用委托时使用的参数)。
通用回调消息将到达第一个端点,并在那里使用参数调用原始委托。
这是有目的的(简化的)序列:
- A 调用 B-proxy.Foo(callback)
- 回调通过 DelegateSurrogate 序列化。
- DelegateSurrogate 将委托存储在专用委托存储中并用令牌替换它
- 消息到达 B 的端点
- 令牌通过 DelegateSurrogate 反序列化
- DelegateSurrogate 构造一个生成的委托
- B.Foo(generatedCallback) 被调用
- 后来,B 调用了 generatedCallback(args)
- generatedCallback(args) 调用 A 端点上的专用通用合约:CallbackContract-proxy.GenericCallback(args)
- CallbackContract.GenericCallback(args) 在 A 的端点上调用
- 从存储中检索原始回调并调用:callback(args)
我之前已经使用服务总线 (NServiceBus) 实现了这一点,但我想将这个想法应用到 WCF 中,但我遇到了困难。我知道如何实现步骤 3、6、9 和 11。我还不知道如何连接 WCF 中的所有内容——尤其是代理部分。
就是这样 - 我希望我的问题是有道理的,并且这里的集体智慧将能够帮助我建立它。
这是我想要的解决方案的示例用法:
// client side
remoteSvc.GetEmployeeById(17, emp =>
{
employees.Add(emp);
logger.log("Result received");
});
// server side
public void GetEmployeeById(int id, Action<Employee> callback)
{
var emp = getEmpFromDb(id);
callback(emp);
}
【问题讨论】:
-
为什么标准的回调机制“繁琐”?
-
因为您需要样板代码才能使用它,并且您需要学习这种机制。另外 - 我不相信它会在像 MSMQ 这样的单向渠道中工作。委托作为回调更直观,因为它们看起来像常规的 C# 代码。
标签: wcf delegates datacontract