2015-02-09 178 views
2

我显然是WCF和Windows服务的新品。使用WCF服务访问承载WCF服务的Windows服务中的数据

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

我开始相信解决这个问题的答案是WCF服务。

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

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

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

感谢您提供任何帮助!

+0

我在这里没有看到任何问题,请阅读:https://msdn.microsoft.com/en-us/library/ms733069(v = vs.110).aspx – Matt 2015-02-09 22:17:24

+0

这与我的肯定不同在所有其他地方都可以看到,因为一切都包含在一个项目中。我已经把所有的东西都分解成了不同的项目。 – 2015-02-10 00:31:01

+0

那么你的wcf服务是独立的exe?或者一个DLL? – Matt 2015-02-10 14:04:45

回答

1

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

下面是我终于架构此解决方案:

我结束了五个项目在此解决方案(SIX,如果算上我用于测试的控制台应用程序):

  • 计数器逻辑 - 桥接 我的客户(S)和服务器
  • Windows服务之间的间隙的部分 - 执行实际时间 和递增
  • WCF服务程序的一部分 - 承载 WCF服务,我的柜台逻辑部分
  • Windows窗体客户端 - 前端 是通过WCF与我的Windows服务通信
  • 接口&数据合同 - 为WCF操作契约和数据契约

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

  • 计数器逻辑 - 的引用接口&数据契约
  • WCF服务 - 引用接口&数据契约
  • Windows服务 - 引用计数器逻辑,WCF服务和接口&数据契约
  • Windows窗体客户端 - 引用接口&数据契约
  • 接口&数据合同 - 引用没有其他项目

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(); 
} 

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

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

这个解决方案现在对我来说非常完美,而且由于将所有各个部分放在他们自己的项目中提供了模块化特性,它允许我创建一个控制台应用程序来托管Counter Logic和WCF服务进行测试,以及。

之前,我在我的机器上安装Windows服务,我能够调试一切都在控制台应用程序,这样我只需要安装我服务一次,并启动它。

0

你是怎么过的计数器对象的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接口的服务与计数器类进行通信。