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

时间:2015-02-09 22:02:00

标签: c# wcf service

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

我有一个Windows服务,除了每秒递增一个整数变量之外什么都不做。我想编写一个简单的Windows窗体客户端,以在标签控件中显示变量的当前值,例如。

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

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

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

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

感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

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

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

我最终得到了这个解决方案中的五个项目(如果算上我用于测试的控制台应用程序,则为SIX):

  • 计数器逻辑 - 执行实际计时的程序部分
  • WCF服务 - 弥合差距的部分 我的客户和服务器
  • Windows服务 - 托管的部分 WCF服务和我的计数器逻辑
  • Windows窗体客户端 - 前端 通过WCF与我的Windows服务进行通信
  • 接口&数据合同 - 适用于WCF运营合同和数据合同

项目以下列方式互相引用:

  • 计数器逻辑 - 参考接口&数据合同
  • WCF服务 - 参考接口&数据合同
  • Windows服务 - 引用计数器逻辑,WCF服务和接口&数据合同
  • Windows窗体客户端 - 参考接口&数据合同
  • 接口&数据合同 - 不参考其他项目

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接口的服务获取与计数器类的通信。