我不确定如何以良好的代码方式处理我的场景。
我工作的基本标准是这样的:
- 使用 WCF 服务的 WPF 应用程序
- 该服务使用每个会话实例
- 会话在应用程序启动后立即开始,并且应该在应用程序生命周期内存在(有小例外)
- 会话中的某些方法调用必须先于并在调用其他方法之前完成
这意味着我必须能够在整个应用程序中拥有一个代理客户端实例。我还必须能够处理异步调用,因此客户端不会挂断,但同时确保它们完成。
我对 WCF 的技术理解非常有限,以至于不知道某些场景是否会按预期工作。所以我要列出我的不确定性:
- 会话何时开始,何时结束。它是基于客户端的创建,还是如果第一个客户端出现故障,一个单独的客户端实例是否可以访问同一个会话。
- 通过 WCF 服务处理异常的最佳方法是什么
- ChannelFactory 是我应该看的东西来帮助我把它放在这里。
所以我在第一次迭代中做了什么来尝试解决其中的一些问题。
- 我使用依赖注入在我的 WPF 应用程序的整个类中注入客户端实例(我正在使用 MVVM),以确保相同的实例无处不在。
- 我使用异步生成方法进行服务引用以获取所有方法的 Begin 和 End 版本,以确保调用是异步的
- 我使用了 Caliburn.Micro 框架的协程(IResult 接口)特性来确保一个异步操作在另一个异步操作开始之前完成(不知道这是否是正确的使用,或者它是否是一个聪明的举动)。
我仍然遇到的问题当然是如何处理客户端的故障状态。我现在假设我可以重新实例化客户端并拯救会话,或者我实际上可以重新设置它。我现在需要在每次注入相同的新实例的地方重新实例化它。
因此,我认为最好创建一个包装客户端的 ClientManager 类。这样我就可以注入这个 ClientManager 并在需要时重新实例化他。我想我应该把他暴露在外面以便能够进行方法调用,但如果我能以某种方式在他内部进行错误处理,那就太好了。我只是在测试我的方法时遇到了困难,而且我不确定它是否会在集成中正常工作,因为我不了解 WCF、协程和线程的所有内部工作原理。
有没有人在这些问题上比我更有经验,可以给我一些指示,或者至少告诉我 WCF 在这些情况下是如何工作的(每个会话)以及我做错了什么,什么是对的。