我显然是 WCF 和 Windows 服务的新手。
我有一个 Windows 服务,它每秒只增加一个整数变量。例如,我想编写一个简单的 Windows 窗体客户端来显示标签控件中变量的当前值。
我开始相信弥合这一差距的答案是 WCF 服务。
我正在尝试在 Windows 服务中托管此 WCF 服务,但我不知道如何将所有内容链接在一起。 WCF 服务包含对 Windows 服务的引用,因此它可以访问整数变量的值。
但是,我不需要在 Windows 服务中引用 WCF 服务来托管它吗?如何避免循环依赖?
我不一定需要特定的代码——我只需要知道是否可以从概念上做我想做的事情以及如何去做。
感谢您提供的任何帮助!
最佳答案
我回去重写了所有内容。我对将所有内容都放在同一个程序集中完全不满意,所以我回去重新设计了整个应用程序。
以下是我最终构建此解决方案的方式:
我最终在该解决方案中完成了五个项目(如果算上我用于测试的控制台应用程序,则为六个):
- 计数器逻辑 - 执行实际计时的程序部分 并递增
- WCF 服务 - 弥合两者之间差距的部分 我的客户和服务器
- Windows 服务 - 承载 WCF 服务和我的计数器逻辑
- Windows 窗体客户端 - 前端 通过 WCF 与我的 Windows 服务通信
- 接口(interface)和数据契约(Contract) - 用于 WCF 操作契约(Contract)和数据契约(Contract)
项目通过以下方式相互引用:
- 反逻辑 - 引用接口(interface)和数据契约
- WCF 服务 - 引用接口(interface)和数据协定
- Windows 服务 - 引用计数器逻辑、WCF 服务以及接口(interface)和数据协定
- Windows 窗体客户端 - 引用接口(interface)和数据协定
- 接口(interface)和数据契约(Contract) - 未引用其他项目
Windows 服务为 WCF 服务和计数器逻辑提供宿主环境。 Windows 服务需要引用 WCF 服务以便实例化和托管它; WCF 服务需要引用 Windows 服务才能访问计数器逻辑中的整数变量。
为了打破这种循环依赖,我没有在 WCF 服务中引用 Windows 服务,而是在创建 ServiceHost 对象时将对计数器逻辑实例的引用从 Windows 服务发送到 WCF 服务:
在 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 服务。由于在任何给定时间只有一个客户端访问我的服务,这对我来说是可以接受的,但如果我希望我的 future ,我将需要研究其他方法来访问标准 ServiceHost 构造函数创建的 WCF 服务实例应用程序可扩展。
这个解决方案现在非常适合我,并且由于将所有不同的部分放在他们自己的项目中所提供的模块化,它允许我创建一个控制台应用程序来托管 Counter Logic 和 WCF 服务以进行测试,因为好吧。
在我的机器上安装 Windows 服务之前,我能够在控制台应用程序中调试所有内容,这样我只需要安装我的服务一次,然后启动它。
关于c# - 使用 WCF 服务访问托管 WCF 服务的 Windows 服务中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420265/