.net 用户界面与应用程序关系

.net 用户界面与应用程序关系,.net,winforms,design-patterns,user-interface,tiers,.net,Winforms,Design Patterns,User Interface,Tiers,我读过很多关于用户界面、商业逻辑、WCF、IoC的文章,但我还是忘了一件事。 我构建了一个winforms应用程序和一个控制台应用程序。控制台应用程序是大脑。 现在,在所有的客户机-服务器体系结构中,客户机“知道”服务器,向他发送请求并获得答案。我的问题如下: 1) 如果用户不知道UI的存在,控制台应用程序如何向用户显示消息?UI是否应该每隔x毫秒检查并汇集消息?这是一个好方法吗 2) 如果UI表单显示股票价格,例如股票价格一直在变化,该怎么办?它是否应该每隔200秒从控制台应用程序请求股票价格

我读过很多关于用户界面、商业逻辑、WCF、IoC的文章,但我还是忘了一件事。 我构建了一个winforms应用程序和一个控制台应用程序。控制台应用程序是大脑。 现在,在所有的客户机-服务器体系结构中,客户机“知道”服务器,向他发送请求并获得答案。我的问题如下:

1) 如果用户不知道UI的存在,控制台应用程序如何向用户显示消息?UI是否应该每隔x毫秒检查并汇集消息?这是一个好方法吗

2) 如果UI表单显示股票价格,例如股票价格一直在变化,该怎么办?它是否应该每隔200秒从控制台应用程序请求股票价格?或者在控制台应用程序中注册回调函数,以便控制台应用程序可以调用它?然而,它现在不是把UI变成了一个服务器吗

3) 如果我想将终端功能添加到我的应用程序(例如telnet cli),会发生什么情况?我应该如何设计它?telnet服务器作为客户端,我的控制台应用程序作为服务器?有没有一个设计可以帮助我实现这一点?驾驶室我问了很多人,似乎没有人在使用它。。。是这样吗

谢谢, Eyal

你为什么不把“大脑”创建成一个图书馆呢?WinForms界面和控制台应用程序都是用户界面,应该与逻辑分离。 这样可以更方便地访问函数,您还可以订阅事件

你为什么不把“大脑”创建成一个图书馆呢?WinForms界面和控制台应用程序都是用户界面,应该与逻辑分离。
这样可以更方便地访问函数,您还可以订阅事件

您的程序应该设计成可以用一个UI替换另一个UI的方式。程序应该能够独立于用户看到的界面而具有逻辑功能。看一看这些规则和模式

对您的程序的一个很好的衡量标准是通过用户可用的界面[API调用、基于控制台的GUI、基于控制台的界面、网络界面、web]我并不是说您应该重新关注应用程序的意图,使其在界面上非常灵活。我建议您的接口应该与应用程序的逻辑和数据存储无关


股票行情:有一个oberserver模式,每200毫秒广播一个新事件,或在发生变化时广播一个新事件。ticker视图将是这些事件的订阅者

您的程序应该设计成可以用一个UI替换另一个UI的方式。程序应该能够独立于用户看到的界面而具有逻辑功能。看一看这些规则和模式

对您的程序的一个很好的衡量标准是通过用户可用的界面[API调用、基于控制台的GUI、基于控制台的界面、网络界面、web]我并不是说您应该重新关注应用程序的意图,使其在界面上非常灵活。我建议您的接口应该与应用程序的逻辑和数据存储无关


股票行情:有一个oberserver模式,每200毫秒广播一个新事件,或在发生变化时广播一个新事件。ticker视图将是这些事件的订阅者

你应该避免你正在考虑的架构。让两个独立的过程一起工作是很复杂的。操作系统在进程之间筑起了一堵墙,以确保一个行为不端的进程不会破坏另一个进程的稳定。每个进程都有自己的内存视图,Windows(尤其是.NET)使得进程很难共享内存

您必须在流程之间建立一个沟通渠道,以使它们协同工作。管道或插座是通常的选择,这里的心智模型是机器通过网络相互交谈。这可能会非常尴尬,你会有web应用程序的所有缺点,没有WinForms客户端或控制台模式应用程序的优点。它也非常不可靠,一个进程的故障很难被另一个应用程序诊断、报告和恢复。我相信您已经看到了使用Internet浏览器可能出现的问题

你可以从一个应用程序中得到你想要的。System.Threading.Thread类为您提供了与控制台模式应用程序相同的道德标准。使用BackgroundWorker类或Control.Begin/Invoke()方法,让UI显示来自brain线程的消息相当简单。顺便说一句,让线程互操作正确仍然是一项努力

有两种方法可以实现股票代码更新。推拉法。推送方法是让后台线程主动通知UI线程更新可用。BackgroundWorker.ReportProgress或Control.Begin/Invoke来执行此操作。在200毫秒更新时,这不是问题

在这样的速度下,拉动模型也同样有效。您可以在UI中使用计时器来获取定期运行的方法。它可以从计时器的Tick方法中的共享属性中读取值。您需要在后台线程和Tick方法中使用lock语句,以确保值不能在UI线程读取值时更改

当值可以非常快速地更改时,您应该支持拉模式,当更新UI所需的时间长于从后台线程进行更新的时间间隔时,推的速度将使UI线程屈服。UI线程将落后,无法执行其正常任务。冻结的UI是诊断,OOM是最终结果。200毫秒不应该是个问题,除非你的UI更新非常花哨或草率,推送应该可以工作

我必须加入你咨询的关于telnet服务器的朋友联盟。不确定他们解决了什么问题,他们是