Я надеюсь, что я правильно понял вашу проблему.У вас есть вся логика внутри библиотеки WCF, но вы не знаете, как синхронизировать подписку и отписаться от событий SqlDependancy при запуске службы Windows, на которой будет размещена ваша служба WCF.
Моя идея состоит в том, чтобы использовать ServiceHostFactory для создания экземпляра вашего сервиса и подключаться к событиям открытия и закрытия вашего сервиса, вызывая все необходимые конструкторы и коннекторы оттуда.
Я основал большую частьмой ответ от этой замечательной и длинной статьи о размещении сервисов WCF со ссылкой, указывающей непосредственно на тему в вашем случае.Некоторые дополнительные документы по ServiceHost и ServiceHostFactory классам.
Имейте в виду, что это не полный код, который вы можете просто скопировать / вставить, а скорее демонстрация использования.
Вот пример вашей службы Windows:
public partial class YourWindowsService : ServiceBase
{
// It's your choice where to create this instance, I used constructor injection here arbitrarily
private readonly YourWCFServiceFactory serviceFactory;
private ServiceHost host;
public YourWindowsService(YourWCFServiceFactory serviceFactory)
{
InitializeComponent();
this.serviceFactory = serviceFactory;
}
protected override void OnStart(string[] args)
{
Type serviceType = typeof(YourService);
host = serviceFactory.CreateServiceHost(serviceType, new string[] { "yourBaseUri" });
host.Open();
}
protected override void OnStop()
{
if(host != null)
host.Close();
}
}
И пример вашей фабрики:
public class YourWCFServiceFactory: ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
host.Opening += new EventHandler(host_Opening);
host.Closing += new EventHandler(host_Closing);
return host;
}
private void host_Opening(object sender, EventArgs e)
{
// Initialization here
}
private void host_Opening(object sender, EventArgs e)
{
// Cleanup here
}
}