Skip to content

ServiceCreator(Of T) 类

WinServicesLib 调度器在SCM启动服务时用于实例化用户服务类的通用工厂。T 是用户的 ITbService 实现;ServiceCreator(Of T)New T 包装在调度器可以按接口持有的工厂中。

语法:New ServiceCreator(Of T )

T
必需 实现 ITbService 的用户类。约束是实际性的而非语法性的——源代码中没有 Where T : ITbService 子句,但工厂的 CreateInstance 返回 New T As ITbService,编译器仅在 T 实现 ITbService 时才接受。

该类是通常赋给 ServiceManager.InstanceCreator 的值:

vb
With Services.ConfigureNew
    .Name             = "MyService"
    .InstanceCreator  = New ServiceCreator(Of MyService)    ' MyService Implements ITbService
End With

包通过引用持有工厂;调度器跳板每次服务启动调用 CreateInstance 一次,在SCM生成服务线程之后。返回的实例是包将路由其 EntryPointStartupFailedChangeState 方法的对象。

参见包概述了解 ServiceCreator 在更广泛生命周期中的位置。

方法

CreateInstance

返回一个转换为 ITbService 的新 New T

语法:creator.CreateInstance As ITbService

用户代码很少直接调用 CreateInstance;包的调度器跳板每次服务启动调用一次。返回的实例由调度器在服务的整个生命周期内拥有——当服务停止或调度器退出时释放。

该方法没有参数;如果用户的服务类需要配置,应从传递给 EntryPointServiceManager 中读取,而非从构造函数参数中读取。

为什么使用工厂而非类引用

ServiceCreator(Of T) 的存在是因为SCM调度模型需要延迟实例化。配置阶段在SCM决定启动哪些服务之前运行于 Sub Main 中;在那里急切地构造服务类会为SCM可能永远不会启动(或只在很久之后才启动)的服务创建不必要的实例。工厂将 New T 调用推迟到服务实际启动时。

同样的间接性让调度器将 ITbService 实例与 ServiceManager 一对一配对——跳板可以将特定服务的 ServiceManager 传入 EntryPoint,而服务类无需在构造时了解管理器。

另见

twinBASIC及其LOGO版权为作者"韦恩"所有