gpt4 book ai didi

sql-server - 使用 VCL for the web (intraweb) 作为将 Web 界面添加到传统非分层(2 层)Delphi win32 应用程序的技巧是否有意义?

转载 作者:行者123 更新时间:2023-12-03 15:26:10 26 4
gpt4 key购买 nike

我的团队正在维护一个巨大的客户端服务器 win32 Delphi 应用程序。它是一个客户端/服务器应用程序(胖客户端),使用 DevArt (SDAC) 组件连接到 SQL Server。

业务逻辑经常“陷入”组件的事件处理程序中,无论如何,通过一定程度的重构,可以将业务逻辑移动到公共(public)单元中(这项工作的很大一部分已经在重构过程中完成了......其他人编写的遗留应用程序非常令人沮丧,但这是一项非常常见的工作)。

现在有一个Web界面的请求,我当然有几个选择,在这个问题中我想重点讨论VCL for the web(intraweb)选项。

这个想法是对客户端/服务器应用程序和 Web 应用程序使用通用代码(相同的 pas 文件)。我听说很多人将旧版应用程序从 delphi 迁移到了 intraweb,但在这里我也尝试保留胖客户端。

想法是使用通用代码,可能会用一些编译器指令来编写特定代码:

{$IFDEF CLIENTSERVER}
{here goes the thick client specific code}
{$ELSE}
{here goes the Intraweb specific code}
{$ENDIF}

另一个问题是“迁移计划”,假设我有 300 个功能,而在第一个版本中,我在 Web 应用程序中仅提供其中 50 个功能。如何跟踪它?我正在考虑使用 Delphi 接口(interface)来处理这个问题。例如,对于用户身份验证,我可以移动过程中的所有相关代码并声明一个接口(interface),例如:

type
IUserAuthentication= interface['{0D57624C-CDDE-458B-A36C-436AE465B477}']
procedure UserAuthentication;
end;

通过这种方式,当我在两个应用程序(胖客户端和 Intraweb)中实现 IUserAuthentication 接口(interface)时,我知道该功能已“移植”到网络上。无论如何,我不知道这种方法是否有意义。我制作了一个原型(prototype)来模拟整个过程。它适用于“Hello world”应用程序,但我想知道它对于大型应用程序是否有意义,或者这个接口(interface)想法只会适得其反,并可能适得其反。

我的问题是:这种方法有意义吗? (接口(interface)的想法只是一个额外的想法,它并不像上面描述的公共(public)代码部分那么重要)它是一个可行的选择吗?

我知道这在很大程度上取决于应用程序的类型,无论如何,一般来说,我的应用程序属于 CRM/会计领域,并且单个安装的并发用户数通常少于 20 个,峰值为 50 个。

额外评论(更新):我问这个问题是因为我没有 n 层应用程序,所以我认为 Intraweb 是拥有与胖客户端具有公共(public)代码的 Web 应用程序的唯一选项。从 Delphi 代码开发 Web 服务在我的具体情况下没有任何意义,因此我的替代方案是使用 ASP.NET 编写 Web 界面(复制业务逻辑),但在这种情况下,我无法利用简单的方法。是的,我也许可以使用 dll,但我的代码不适合这样做。

最佳答案

您必须记住的最重要的事情是:

  • 您的胖客户端 .EXE 进程一次由一个人使用(多人将拥有该 .EXE 的多个实例)。
  • 您的 Intraweb .EXE 进程将同时被许多人使用。它们都共享同一个进程实例。

这意味着您的业务逻辑不仅必须重构为通用单元,而且业务逻辑的实例必须能够多次驻留在内存中,并且不会相互干扰。

这从与数据库对话的业务逻辑开始:您必须能够同时拥有多个数据库连接(实际上,数据库连接池效果最好)。

根据我的经验,当您可以将业务逻辑重构为数据模块时,您就有了一个很好的起点来支持应用程序的 Intraweb 和胖客户端版本。

您不应该忘记用户界面:

  • 胖客户端支持模态表单,并且拥有更丰富的 UI
  • 网络浏览器仅支持消息对话框(而且这些对话框非常有限),所有精美的 UI 内容都会花费大量的开发时间(尽管例如,TMS 有一些 nice components for Intraweb )

然后,最重要的是,您必须应对 HTTP 协议(protocol)的无状态性质。为了克服这个问题,您需要进行 session 。 Intraweb 将处理大部分 session 部分。
但你需要问自己这样的问题:

  • 如果用户空闲 XX 分钟会发生什么情况?
  • 内存中可以存储多少 session 状态?如果不合适怎么办?
  • 如何处理无法装入内存的 session 状态?

这只是一个开始,因此当您需要更多信息时请告知我们。
如果它对您的应用非常具体,您可以随时直接与我联系:只需在 google 上搜索我即可。

--杰罗恩

关于sql-server - 使用 VCL for the web (intraweb) 作为将 Web 界面添加到传统非分层(2 层)Delphi win32 应用程序的技巧是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com