4

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

业务逻辑通常被“困”在组件的事件处理程序中,无论如何,通过某种程度的重构,将业务逻辑移动到公共单元中是可行的(这项工作的很大一部分已经在重构期间完成了......维护遗留应用程序的人else write 非常令人沮丧,但这是一个非常常见的工作)。

现在有一个Web界面的请求,我当然有几个选项,在这个问题中我想专注于VCL for web(intraweb)选项。

这个想法是为客户端/服务器应用程序和 Web 应用程序使用公共代码(相同的 pas 文件)。我听说很多人将遗留应用程序从 delphi 转移到 intraweb,但在这里我也试图保留厚客户端。

思路是使用通用代码,可能是用一些编译器指令来写具体代码:

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

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

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

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

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

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

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

4

2 回答 2

5

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

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

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

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

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

您不应该忘记用户界面:

  • 胖客户端支持模态表单,并拥有更丰富的 UI
  • Web 浏览器只支持消息对话框(然后:那些非常有限),所有花哨的 UI 东西都需要花费大量的开发时间(尽管例如,TMS 有一些很好的 Intraweb 组件

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

  • 如果用户空闲 XX 分钟会发生什么?
  • 我可以在内存中存储多少会话状态?如果不合适怎么办?
  • 我该如何处理不适合内存的会话状态?

这只是一个开始,所以当您需要更多信息时请告知使用。
如果它对您的应用非常具体,您可以随时直接与我联系:只需谷歌我即可。

——杰伦

于 2010-05-11T16:21:37.830 回答
1

我认为如果将应用程序移至 n 层将是一个更好的解决方案,之后桌面和 Web 应用程序将更容易使用。

您已经通过将业务逻辑与演示文稿解耦完成了第一部分,您可以使用与 Delphi 捆绑的RemObject SDK 或 DataSnap。

之后,您将拥有工作的桌面应用程序,并且您可以使用 Intrawebm Asp.net 或任何用于 Web 部件的东西,这样您就不必再次为 Web 部件复制业务逻辑。

通常将桌面应用程序转换为 Web 应用程序并不像您想象的那样容易,因为它们在不同的环境中工作,您需要按照本质构建每个应用程序。

于 2010-05-11T21:13:26.743 回答