Создание базового класса для служб Windows - PullRequest
0 голосов
/ 16 января 2012

В нашем приложении есть несколько служб Windows (более 30), которые должны работать за кулисами для обработки данных в определенное время в течение дня.Я пытался создать класс BaseService, от которого я мог бы унаследовать этот протокол, который бы регистрировал нашу базу данных при запуске или остановке службы, а также некоторые другие общие функции.Тем не менее, я столкнулся с ограничителем показа при попытке создать BaseService как MustInherit, так как у нас есть ряд свойств MustOverride.Проблема заключается в:

<MTAThread()> Shared Sub Main()

Наш код весь в VB (как вы, вероятно, можете сказать).Учитывая, что это общий метод, я не могу переопределить его (т.е. сделать его MustOverride).Без этого метода код не будет компилироваться, однако он не будет работать в базовом классе.Код в этом методе:

Dim ServicesToRun() As System.ServiceProcess.ServiceBase
 ServicesToRun = New System.ServiceProcess.ServiceBase() {New BaseService}
 System.ServiceProcess.ServiceBase.Run(ServicesToRun)

Невозможно создать BaseService (имя моего базового класса), поскольку он указан как MustInherit.И в этом заключается моя проблема.Я не могу создать это в базовом классе и не могу переопределить его в наследующих классах.

1 Ответ

0 голосов
/ 16 января 2012

Вот как мы решили эту точную проблему: мы передаем тип реализации разделяемому MainBase в базовом классе обслуживания, а затем вызываем его из класса реализации.

Вот код из базового класса обслуживания:

' The main entry point for the process
<MTAThread()> _
Shared Sub MainBase(ByVal ImplementingType As System.Type)
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase

    If InStr(Environment.CommandLine, "StartAsProcess", CompareMethod.Text) <> 0 Then
        DirectCast(Activator.CreateInstance(ImplementingType), ServerMonitorServiceBase).OnStart(Nothing)
    Else
        ServicesToRun = New System.ServiceProcess.ServiceBase() {DirectCast(Activator.CreateInstance(ImplementingType), ServiceBase)}
        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If

End Sub

А вот код из реализующего класса:

' The main entry point for the process. The main method can't be inherited, so 
' implement this workaround
<MTAThread(), LoaderOptimization(LoaderOptimization.MultiDomain)> _
Shared Sub Main()

    Call MainBase(GetType(ThisImplementedService))
End Sub
...