使用VCL for the web (intraweb) 作为一个技巧,将Web界面添加到遗留的非分层(2层)Delphi win32应用程序中,这样做是否有意义?

4
我的团队正在维护一个庞大的客户端服务器win32 Delphi应用程序。这是一个使用DevArt(SDAC)组件连接到SQL Server的客户端/服务器应用程序(厚客户端)。
业务逻辑通常“陷入”组件的事件处理程序中,但通过一定程度的重构,可以将业务逻辑移动到公共单元中(在重构期间已完成此工作的大部分工作...维护其他人编写的遗留应用程序非常令人沮丧,但这是一项非常常见的工作)。
现在有一个web界面的请求,我当然有几个选项,在这个问题上我想集中讨论VCL for the web(intraweb)选项。
这个想法是使用相同的pas文件的公共代码来处理客户端/服务器应用程序和Web应用程序。我听说过许多人将遗留应用程序从Delphi移植到Intraweb,但在这里我也想保持厚客户端。
这个想法是使用公共代码,可能带有一些编译器指令来编写特定的代码:
{$IFDEF CLIENTSERVER}
  {here goes the thick client specific code}
{$ELSE}
  {here goes the Intraweb specific code}
{$ENDIF}

接下来的一个问题是“迁移计划”,假设我有300个功能,在第一次发布时,只会有其中50个在Web应用程序中可用。如何跟踪它们?我考虑(滥用)使用Delphi接口来处理这个问题。例如,对于用户认证,我可以将所有相关代码移到一个过程中,并声明一个接口,如下:

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

通过在两个应用程序(厚客户端和Intraweb)中实现IUserAuthentication接口,我知道该功能已经“移植”到了Web。无论如何,我不知道这种方法是否有意义。我制作了一个原型来模拟整个过程。它适用于“Hello world”应用程序,但我想知道它在大型应用程序上是否有意义,或者这种接口思想只会产生反作用。

我的问题是:这种方法有意义吗?(接口思想只是额外的想法,与上述共同代码部分一样重要)它是一个可行的选项吗?

我理解它很大程度上取决于应用程序的类型,无论如何,为了通用性,我的应用程序位于CRM /会计领域,并且单个安装的并发用户数量通常少于20个,峰值为50个。

额外评论(更新):我提出这个问题是因为由于我没有n层应用程序,所以我将Intraweb视为具有与厚客户端相同代码的Web应用程序的唯一选择。从Delphi代码开发Web服务在我的特定情况下毫无意义,因此我唯一的选择是使用ASP.NET编写Web界面(复制业务逻辑),但在这种情况下,我无法轻松地利用共同代码。是的,我可以使用dlls,但我的代码不适合这样做。

2个回答

5

你需要记住的最重要的事情是:

  • 你的厚客户端.EXE进程一次只能被一个人使用(多个人将拥有多个该.EXE实例)。
  • 你的Intraweb .EXE进程将同时被许多人使用。他们都共享同一个进程实例。

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

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

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

你不应该忘记用户界面:

  • 厚客户端支持模态窗体,并具有更丰富的用户界面
  • Web浏览器仅支持消息对话框(而且非常有限),所有花哨的UI都需要耗费大量开发时间(尽管例如,TMS为Intraweb提供了一些不错的组件

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

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

这只是一个开始,所以让我们知道您需要更多信息的时候。
如果变得非常特定于您的应用程序,您可以直接联系我:只需搜索我的名字。

--jeroen


我的应用程序有一些常见的库、表单和数据模块。表单和数据模块有时存在高度耦合,所以我可能需要消除数据模块中表单的依赖关系,或者使用条件代码来管理IW和VCL。 从状态的角度来看,我的应用程序相当简单。我需要进行一些IW研究,等待IW XI的一些文档可用。当我开始进行一些代码调查时,我会考虑向您发送一个原型(我的应用程序的非常简化版本和一个建议的IW版本,以便您进行评论)。谢谢。 - UnDiUdin
1
请仔细查看我在以下链接末尾提到的演讲“使用数据库和数据感知控件编写更智能的代码”。它介绍了一些想法和组件,使得消除表单和数据模块之间的依赖关系更加容易。http://wiert.wordpress.com/2009/04/24/spoken-coderage-iii-december-1-5-2008-on-delphi-database-and-xml-related-topics/ - Jeroen Wiert Pluimers

1

我认为将您的应用程序转移到n层架构将是更好的解决方案,之后它将更容易被桌面和Web应用程序使用。

您已经通过将业务逻辑与表示解耦的第一部分完成了这项工作,可以使用 RemObject SDK或随Delphi捆绑的DataSnap。

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

通常将桌面应用程序转换为Web应用程序并不像您想象的那么简单,因为它们在不同的环境中运行,您需要根据其特性构建每个应用程序。


如果n层架构对我来说是一个选项,我肯定会选择它。但不幸的是,已经有太多的代码了,大部分都在数据模块中,这就是为什么Intraweb对我如此吸引的原因。通过将代码移动到数据模块中,我可以轻松地重构代码。n层架构是完全重写应用程序的一种选择,但这样做的成本/收益对于我的公司来说是不可接受的。非常感谢您的回复。 - UnDiUdin
如果你需要处理理想的n层设计,我曾经在一个需要与asp.net一起工作的旧应用程序中这样做过。因此,我将大部分所需功能公开到另一个Web服务应用程序中,该应用程序与桌面应用程序共享相同的代码,然后由asp.net应用程序调用,现在它运行得非常好。;-) - Mohammed Nasman
有两个应用程序共享相同的数据模块不是一种逻辑上的 N 层吗? - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接