使用 WCF 服务访问托管 WCF 服务的 Windows 服务中的数据

Using WCF Service to Access Data in a Windows Service That's Hosting the WCF Service

我显然是 WCF 和 Windows 服务的新手。

我有一个 Windows 服务,它每秒只增加一个整数变量。例如,我想编写一个简单的 Windows 表单客户端来显示标签控件中变量的当前值。

我开始相信弥合这一差距的答案是 WCF 服务。

我正在尝试在 Windows 服务中托管此 WCF 服务,但我不知道如何 link 将所有内容整合在一起。 WCF 服务包含对 Windows 服务的引用,因此它可以访问整数变量的值。

但是,我不需要在 Windows 服务中引用 WCF 服务来托管它吗?如何避免循环依赖?

我不一定需要特定的代码 -- 我只需要知道是否可以做我想做的事情以及如何从概念上做到这一点。

感谢您提供的任何帮助!

我回去重写了所有内容。我对将所有东西都放在同一个程序集中完全不满意,所以我回去重新设计了整个应用程序。

以下是我最终构建此解决方案的方式:

我最终在该解决方案中完成了五个项目(如果算上我用于测试的控制台应用程序,则为六个):

  • 计数器逻辑 - 执行实际计时的程序部分 并递增
  • WCF 服务 - 弥合两者之间差距的部分 我的客户和服务器
  • Windows 服务 - 托管的部分 WCF 服务和我的计数器逻辑
  • Windows Forms Client - 前端 通过 WCF
  • 与我的 Windows 服务通信
  • 接口和数据契约 - 用于 WCF 操作契约和数据契约

项目之间通过以下方式相互引用:

  • 计数器逻辑 - 参考接口和数据契约
  • WCF 服务 - 引用接口和数据协定
  • Windows 服务 - 引用计数器逻辑、WCF 服务以及接口和数据协定
  • Windows Forms Client - 参考接口和数据契约
  • 接口和数据契约 - 未引用其他项目

Windows 服务为 WCF 服务和计数器逻辑提供宿主环境。 Windows 服务需要引用 WCF 服务以便对其进行实例化和托管; WCF 服务需要引用 Windows 服务才能访问计数器逻辑中的整数变量。

为了打破这种循环依赖,我没有在 WCF 服务中引用 Windows 服务,而是从 Windows 服务向 WCF 服务发送了对计数器逻辑实例的引用,当我创建 ServiceHost 对象时:

在Windows服务项目中:

protected override void OnStart(string[] args)
{
    if (_serviceHost != null)
    {
        _serviceHost.Close();
    }

    _counterObject = new CounterClass();
    _counterObject.StartCounting();

    _wcfService = new CounterWCFService(_counterObject);

    _serviceHost = new ServiceHost(_wcfService);
    _serviceHost.Open();
}

但是,这一方案至少有一个缺点。为了将计数器逻辑实例作为参数传递给 WCF 服务,我无法使用接受 WCF 服务类型的典型 ServiceHost 构造函数。此构造函数只能在 WCF 服务的构造函数无参数时使用。相反,我使用了接受 WCF 服务实例的重载构造函数。这就是我在将 WCF 服务传递给 ServiceHost 之前实例化 WCF 服务并将 _counterObject 作为参数传递的原因。

这将我们限制为指定为单例 (InstanceContextMode = Single) 的 WCF 服务。由于在任何给定时间只有一个客户端访问我的服务,这对我来说是可以接受的,但如果我希望我的未来,我将需要研究其他方法来访问标准 ServiceHost 构造函数创建的 WCF 服务实例应用程序可扩展。

这个解决方案现在非常适合我,并且由于将所有不同的部分放在他们自己的项目中提供的模块化,它允许我创建一个控制台应用程序来托管计数器逻辑和 WCF 服务以进行测试, 还有。

在我的机器上安装 Windows 服务之前,我能够调试控制台应用程序中的所有内容,这样我只需要安装我的服务一次,然后启动它。

在 WCF 服务对象中没有计数器引用的情况下,如何将计数器对象传递给 WCF 服务?

 _counterObject = new CounterClass();
 _counterObject.StartCounting();
_wcfService = new CounterWCFService(_counterObject);

这与上面的项目参考列表冲突:

项目之间通过以下方式相互引用:

Counter Logic - references Interfaces & Data Contracts
WCF Service - references Interfaces & Data Contracts
Windows Service - references Counter Logic, WCF Service, and Interfaces & Data Contracts
Windows Forms Client - references Interfaces & Data Contracts
Interfaces & Data Contracts - references no other project

我正在尝试计算引用以通过 WCF 接口的服务获取与计数器 class 之间的相互通信。