在作为Windows服务托管的WCF类库项目中使用SqlDependency

Anu*_*uya 6 c# wcf windows-services sqldependency

我创建了一个通知服务,SqlDependency用于通知其他服务有关特定表中的更改.这是在Visual Studio的Windows服务模板中完成的.因此,在该OnStart事件中,SqlDependency创建订阅,并且在OnStop事件期间,完成取消订阅.

上述解决方案工作得很好.

现在,由于某些原因,我必须将其作为WCF类库项目并将其作为Windows服务托管.我无法想到SqlDependency在这种情况下可以进行订阅和取消订阅的地方.

启动Windows服务时,必须自动完成订阅.

注意:我有一个通用的Windows服务主机,它将托管我所有的WCF类库项目,并且在那里做不了多少.

这有什么解决方案或解决方法吗?

小智 0

我希望我能解决你的问题。您拥有 WCF 库内部的所有逻辑,但不知道如何在将托管 WCF 服务的 Windows 服务启动时同步订阅和取消订阅 SqlDependancy 事件。

我的想法是使用 ServiceHostFactory 创建服务的实例,并挂钩服务的打开和关闭事件,从那里调用所有必要的构造函数和连接器。

我的大部分答案都来自这篇关于托管 WCF 服务的精彩而冗长的文章,其中的链接直接指向您案例中的主题。有关ServiceHostServiceHostFactory类的一些附加文档。

请记住,这不是您可以复制/粘贴的完整代码,而是用法演示。

以下是 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

以及你们工厂的一个例子:

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
    }
}
Run Code Online (Sandbox Code Playgroud)