我显然是WCF和Windows服务的新手。
我有一个Windows服务,除了每秒递增一个整数变量之外什么都不做。我想编写一个简单的Windows窗体客户端,以在标签控件中显示变量的当前值,例如。
我已经开始相信弥合这一差距的答案是WCF服务。
我试图在Windows服务中托管此WCF服务,但我不知道如何将所有内容链接在一起。 WCF服务包含对Windows服务的引用,以便它可以访问整数变量的值。
但是,我不需要在Windows服务中引用WCF服务以便托管它吗?如何避免循环依赖?
我不一定需要特定的代码 - 我只需要知道我是否有可能做我想做的事情以及如何做,概念上。
感谢您提供的任何帮助!
答案 0 :(得分:1)
我回去重写了一切。我完全不满意将所有东西放在同一个组件中,所以我回去重新设计了整个应用程序。
以下是我最终构建此解决方案的方法:
我最终得到了这个解决方案中的五个项目(如果算上我用于测试的控制台应用程序,则为SIX):
项目以下列方式互相引用:
Windows服务为WCF服务和计数器逻辑提供托管环境。 Windows服务需要引用WCF服务以实例化并托管它; WCF服务需要引用Windows服务才能访问计数器逻辑中的整数变量。
为了打破这种循环依赖,而不是在WCF服务中引用Windows服务,我在创建ServiceHost对象时,从Windows服务向WCF服务发送了对Counter Logic实例的引用:
在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();
}
然而,该方案至少存在一个缺点。为了将Counter Logic实例作为参数传递给WCF服务,我无法使用接受WCF服务类型的典型ServiceHost构造函数。只有在WCF服务的构造函数不含参数时,才能使用此构造函数。相反,我使用了重载的构造函数来接受WCF服务的INSTANCE。这就是我实例化WCF服务并在将WCF服务传递给ServiceHost之前将_counterObject作为参数传递的原因。
这将我们限制为指定为Singleton的WCF服务(InstanceContextMode = Single)。由于在任何给定时间只有一个客户端访问我的服务,这对我来说是可以接受的,但我需要调查其他方法来获取对标准ServiceHost构造函数创建的WCF服务实例的访问权限,如果我希望我的未来应用程序可扩展。
此解决方案现在非常适合我,并且由于通过将所有各个部分放在他们自己的项目中提供的模块化,它允许我创建一个控制台应用程序来托管Counter Logic和WCF Service进行测试,如好。
在我的机器上安装Windows服务之前,我能够调试控制台应用程序中的所有内容,这样我只需安装一次服务,然后启动它。
答案 1 :(得分:0)
如何在没有WCF服务对象中的Counter引用的情况下将计数器对象传递给WCF服务?
fit()
这与上面的项目参考列表冲突:
项目以下列方式互相引用:
_counterObject = new CounterClass();
_counterObject.StartCounting();
_wcfService = new CounterWCFService(_counterObject);
我正在尝试计算引用,以通过WCF接口的服务获取与计数器类的通信。