我已经阅读了很多关于用户界面,商业逻辑,WCF,IoC的文章,但是,我还记得有一件事。 我构建了一个winforms应用程序和一个控制台应用程序控制台应用程序是大脑。 现在,在所有客户端 - 服务器架构中,客户端“知道”服务器,向他发送请求并获得答案。我的问题如下:
1)如果控制台应用程序不知道UI的存在,它如何向用户显示消息? UI是否应每x毫秒检查并汇总消息?这是一个好方法吗?
2)在UI表格的情况下应该显示股票价格,例如股票价格一直在变化?它应该每200毫秒从控制台应用程序请求股票价格吗?或者在控制台应用程序中注册回调函数,以便控制台应用程序可以调用它?但是,它现在不能将UI变成服务器吗?
3)如果我想在我的应用程序中添加终端功能(例如telnet cli)会发生什么,我该如何设计呢? telnet服务器作为客户端,我的控制台应用程序作为服务器?有没有可以帮助我实现这一目标的设计?出租车?我问了很多人,似乎没有人在使用它......是这样的吗?
谢谢, 的Eyal
答案 0 :(得分:2)
您的程序应该以这样的方式设计,即您可以将一个UI替换为另一个UI。程序应该能够独立于用户看到的界面具有逻辑功能。请查看MVC和Observer模式。
您的程序的一个很好的衡量标准是通过用户可用的接口[API调用,基于控制台的GUI,基于控制台的界面,网络界面,网络]我并不是说你应该重新调整其意图。应用程序使界面非常灵活。我建议您的界面与应用程序的逻辑和数据存储无关。
股票代码:具有每200毫秒或更改时广播新事件的服从者模式。股票代码视图将是这些事件的订阅者。
答案 1 :(得分:1)
为什么不将“大脑”创建为图书馆? WinForms界面和控制台应用程序都是用户界面,应该与逻辑分开。 这样可以更轻松地访问功能,还可以订阅事件。
答案 2 :(得分:1)
您应该避免使用您正在考虑的架构。让两个独立的过程协同工作很复杂。操作系统在进程之间设置了一道大墙,以确保一个行为不当的进程不会破坏另一个进程。每个进程都有自己的内存视图,Windows(尤其是.NET)使进程很难共享内存。
您必须在流程之间建立通信渠道,以使它们协同工作。通常选择管道或插座,这里的心理模型是通过网络相互通信的机器。这可能非常尴尬,您将拥有Web应用程序的所有缺点,没有WinForms客户端或控制台模式应用程序的优点。它也非常不可靠,一个进程的失败很难被其他应用程序诊断,报告和恢复。我确定你已经看到使用互联网浏览器会出现什么问题。
您可以从一个应用程序中获得所需内容。 System.Threading.Thread类为您提供了控制台模式应用程序的道德等价物。使用BackgroundWorker类或Control.Begin / Invoke()方法获取UI以显示来自大脑线程的消息非常简单。只有“公平”顺便说一句,获得正确的线程互操作仍然是一种努力。
有两种方法可以实现股票代码更新。推动与拉动方式。推送方法是让后台线程主动通知UI线程更新可用。 BackgroundWorker.ReportProgress或Control.Begin / Invoke来做到这一点。在200毫秒更新时,这不是问题。
在这样的速度下,拉模型也可以正常工作。您可以在UI中使用Timer来获取定期运行的方法。它可以从计时器的Tick方法中读取共享属性的值。您需要在后台线程和Tick方法中使用lock语句,以确保在UI线程读取值时不能更改该值。
当值可以非常快速地改变时,您应该支持拉模型,当更新UI所需的时间长于后台线程更新之间的时间段时,推动的速度会使UI线程陷入困境。 UI线程将落后并且无法解决其正常职责。冻结的UI是诊断,OOM是最终结果。 200毫秒不应该是一个问题,除非你的UI更新非常花哨或草率,推送应该工作。
我必须加入你咨询的有关telnet服务器的朋友联盟。不知道他们解决了什么问题,当每个人都使用绿屏终端与计算机通话时,他们是1990年的网络服务器。它可能适用于将单独的控制台模式应用程序连接到UI应用程序的需要。您不会使用telnet来执行此操作,套接字是通用通道。 .NET Remoting,或者更好的是,WCF是位于该通道之上的层,以避免必须通过一串字节来处理压缩数据或方法参数的复杂性。如果你已经完全陷入了多进程解决方案的追求。你不应该是一个股票报价应用程序,如果没有人在那里查看它们,没有人关心他们打勾的方式。也许在森林里倒下的树。