我正在考虑创建一个TService Descendant,以便在编写新服务时我不会重新发明轮子。
我创建了一个祖先工作者线程,该TService后代将负责管理(后代线程实现服务的代码)。
此TService后代还将有一个用于写入自定义Windows事件日志的类,以及一个从http服务器检查新版本服务的线程,然后在需要时自行更新。
我的问题是从项目源实例化TService后代的最佳方法是什么?
后代应该是纯粹的类还是有dfm / datamodule?
答案 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”的类似方法: