我有一个想法,但我需要帮助来实现它。
WCF 在其合同中不支持委托。相反,它有一个繁琐的回调合约机制,我正在寻找一种方法来克服这个限制。
我考虑过使用 aIDataContractSurrogate
将合同中的每个委托替换为将被序列化到远程端点的令牌。在那里,令牌将被反序列化为生成的委托。此生成的委托将发送一个通用回调消息,该消息封装了所有参数(调用委托时使用的参数)。
通用回调消息将到达第一个端点,并在那里使用参数调用原始委托。
这是有目的的(简化的)序列:
- A 调用 B-proxy.Foo(callback)
- 回调通过 DelegateSurrogate 序列化。
- DelegateSurrogate 将委托存储在专用委托存储中,并用令牌替换它
- 消息到达 B 的端点
- 令牌通过 DelegateSurrogate 反序列化
- DelegateSurrogate 构造一个生成的委托
- B.Foo(generatedCallback) 被调用
- 稍后,B 正在调用 generatedCallback(args)
- generatedCallback(args) 在 A 的端点上调用一个专用的通用合约:CallbackContract-proxy.GenericCallback(args)
- 在 A 的端点上调用 CallbackContract.GenericCallback(args)
- 从存储中检索原始回调并调用:callback(args)
NServiceBus
我之前已经使用服务总线(我知道如何实现步骤 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);
}