创建TService后代

时间:2011-05-18 18:51:21

标签: delphi inheritance windows-services

我正在考虑创建一个TService Descendant,以便在编写新服务时我不会重新发明轮子。

我创建了一个祖先工作者线程,该TService后代将负责管理(后代线程实现服务的代码)。

此TService后代还将有一个用于写入自定义Windows事件日志的类,以及一个从http服务器检查新版本服务的线程,然后在需要时自行更新。

我的问题是从项目源实例化TService后代的最佳方法是什么?

后代应该是纯粹的类还是有dfm / datamodule?

2 个答案:

答案 0 :(得分:2)

您可以“只”启动新的服务应用程序。那将为你创建一个TService后代(顺便说一下,在它自己的数据模块中)?它还负责在dpr中为您实例化服务。 (启动新的服务应用程序:文件|新建|其他| Delphi项目|服务应用程序)。此外,它还将确保包含正确的单元,因为服务应用程序需要“Application”全局变量来引用TServiceApplication实例,而不是为普通VCL Forms应用程序实例化的实例。

有关简单的服务应用实施,请参阅Service OnExecute fails, spawned thread is not executed

DataModules支持Visual Form继承,就像Forms一样。因此,如果要创建后代,可以向dpr添加新的服务数据模块,并从IDE已创建的服务继承。然后使用项目选项|用于控制从dpr(右手列表中的第一个)实例化哪一个的表单或手动编辑dpr。

换句话说:使用在创建新服务应用程序时创建的TService1作为公共基础,并通过使用可视化表单继承继承该基础来创建后代服务。档案|新的|其他|可继承项,应列出您的第一个服务数据模块。

答案 1 :(得分:0)

我不会太乱用IDE创建的TService后代。

为了可重用,您可以创建自己的基类“TMyServiceConsumer”。您可以将TService对象传递给它,然后您可以跨项目重用此类。

这是“继承与构成”的典型例子:

inheritance vs. composition for testability

对于问题的视觉与非视觉部分:取决于。

如果您经常使用组件并希望拥有RAD的优势,那么使消费者成为TDataModule后代是非常有用的。

这是Marjan alreasy在另一个答案中指出的“TMainWorkThread”的类似方法:

Service OnExecute fails, spawned thread is not executed