应用程序的体系结构有许多组件需要考虑并且可以通过多种方式进行设计,因此对该问题没有明确的答案,但在设计问题时应该考虑一些重要的问题.在开发桌面应用程序时,您应该考虑它与Web应用程序的主要区别,并尝试解决它们带来的挑战.
网络(或Internet)连接:桌面应用程序可能始终没有活动的网络连接,因此除非您希望程序在活动连接不可用时每次事务都失败,否则它应具有其本地嵌入式数据库(如h2)当活动连接可用时,稍后将数据与远程服务器中的Web应用程序同步(由于服务器端验证,负载平衡等原因,请勿直接连接到远程DB!).
桌面应用程序本质上是独立的,所以如果没有互联网连接就无法运行,那么桌面应用程序的重点是什么呢?
同步:上一点表明您应该拥有本地数据库并将其与远程服务器应用程序同步.请记住,同步应该是两种方式:A)将本地数据发送到服务器B)从服务器接收数据并将其保存在本地数据库中.如果数据模型复杂且充满依赖性,因为依赖实体需要同步在一起,这可能会非常棘手,并且会增加连接失败或断电等事件中同步操作的风险.还应考虑数据模型的变化.所以试着:
将数据模型设计为尽可能小.
避免实体之间的依赖关系.
避免在数据模型中对跨用户交互进行建模,因为它打破了应用程序被设计为由用户使用而不管其他用户(在桌面应用程序中经常出现这种情况)的假设.
设计用于同步的协议,该协议考虑数据模型的更改,并且可能需要在同步开始之前更新程序.
更新:桌面应用程序通常需要定期更新.您必须在设计架构的所有步骤中牢记这一点,特别是在设计高级模块时,因为它们应尽可能独立,以便可以独立更新.您还需要设计更新方案来处理此要求.
多线程: JavaFx和大多数桌面框架(我所知道的)都有一个主线程,可以驱动应用程序和UI组件在其中进行更新.同步和数据库事务之类的耗时操作不应该在主线程中完成,因为它们会导致程序冻结.它们应该在一个单独的后台线程中运行,并定期将它们的进度通知给mian线程.
数据库会话:在Web应用程序中,打开会话视图是一种流行的数据库会话策略,但实现它对桌面应用程序来说可能很棘手.请记住,通常为整个应用程序设置一个会话并不是一个好主意,因为您不应该长时间保持会话打开(例如,如果您正在使用hibernate,请特别注意).
通知:实施通知系统以定期检查远程更改并通知用户是一个好主意.