Использование SqlDependency в проекте библиотеки классов WCF, размещенном как служба Windows - PullRequest
0 голосов
/ 30 ноября 2018

Я создал службу уведомлений, используя SqlDependency для уведомления других служб об изменениях в конкретной таблице.Это делается в шаблоне службы Windows от Visual Studio.Следовательно, в событии OnStart создается подписка на SqlDependency, а во время события OnStop отменяется подписка.

Приведенное выше решение работает идеально.

ТеперьПо некоторым причинам я должен сделать этот проект библиотеки классов WCF и разместить его в качестве службы Windows.Я не мог придумать, где в таком случае можно сделать подписку и отменить подписку на SqlDependency.

Когда служба Windows запущена, подписка должна выполняться автоматически.

Примечание. У меня есть общий хост-сервис Windows, на котором будет размещен весь мой проект библиотеки классов WCF, и я не смогу там ничего сделать.

Есть ли какое-либо решение или обходной путь для этого?

1 Ответ

0 голосов
/ 12 декабря 2018

Я надеюсь, что я правильно понял вашу проблему.У вас есть вся логика внутри библиотеки 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
    }
}
...