2011-03-16 64 views
0

请参见下图,了解在Cient和主机之间实现WCF的VS2008解决方案。客户端是一个简单的Windows窗体应用程序,主机是一个控制台应用程序。我打算使用Windows服务作为主机,但现在我正在使用控制台应用程序进行简单和调试。初学者WCF设置/实现设计方法

两者之间的通信是DCCService(WCF部分)使用netNamedPipeBinding;客户端和主机都将驻留在同一台机器上。另外,我知道将WCF服务与主机分开是一种很好的做法,所以主机可以很容易地更改,这对我来说很好。

WCF Setup in VS2008

这里是我的难题:应该在哪里工作,做的是客户会打电话?

我希望我的服务所做的工作是在设定的时间间隔内不断地在后台轮询硬件控制器。虽然DCCService将方法公开给任何想要了解这些数据的客户端。

在DCCService项目或主机项目中是否应完成硬件控制器代码(setup(),connect(),work()等)?如果在主机项目中完成,DCCService类如何从Host项目的Controller类中获取数据?同样,如果Controller类在DCCService Project中,这将如何完成?哪个更好?

我想我错过了这里相当基本的东西。我很感谢帮助或建议。如果我需要更清楚,请让我知道。

瑞安R.

回答

2

轮询设备的代码在逻辑上是WCF服务的一部分,而不是主机项目。代码是否物理地驻留在WCF服务项目中或由WCF服务项目引用的类库是个人偏好。

下面是我做过的。

我有一个WCF CollectionService托管在Windows服务中。 CollectionService项目显然有一个CollectionService类,该类实现启用WCF的ICollectionService接口,这是客户端与CollectionService进行交互的方式。

在这个相同的项目中,我有一个Collector类有一个私人的构造函数,防止在类的范围之外创建类的实例。该类有一个私人的静态列表Collectors它维护。该课程还有两个静态功能 - Start()Stop()

当客户想要启动Collector时,它会调用CollectionService的Start()操作。该CollectionService又调用静态的Collector.Start()函数,该函数创建一个Collector实例并将其存储在Collectors的静态列表中。当客户希望停止Collector时,它会调用CollectionService的Stop()操作,该操作将转换为对静态Collector.Stop()函数的调用,并停止Collector并将其从列表中删除。

当一个Collector被实例化时,它会启动一个新的线程,开始收集数据并将其提供给相关方。 新线程是关键。否则,Collector实例将仅仅位于Collectors的列表中,而不会执行任何操作。

因为我正在处理线程,显然我必须处理同步问题,例如同步对静态列表Collectors的访问。我不希望客户试图启动Collector,而其他人试图关闭它。

就是这样。

如果您还没有创建Windows服务,下面是我写的两篇SO帖子,详细介绍了如何做到这一点。

第一个环节基本上可以让你的服务;第二个显示如何安装/卸载它,而不需要InstallUtil

我希望这会有所帮助。

编辑

如果只有一个Controller可以处于运行状态,那么后续调用启动Controller可以简单地被忽略,可能用于指示其已在运行的返回消息。

如果您希望多个客户端访问Controller中的数据,这非常简单。你只需要维护一个订阅者列表。 Controller只是将数据发送给列表中的任何订户。

WCF中的这种Publish-Subscribe框架已经存在。你可以在这里阅读细节:

What You Need To Know About One-Way Calls, Callbacks, And Events

您可以从朱瓦尔·洛的网站,下载IDesign.net这个框架是免费的。我正在使用这个概念向有兴趣的各方发出CollectionService事件的信号。我希望您可以使用相同的概念向多个客户端提供数据。

+0

感谢您的真棒回答。一个重要的警告是控制器一次只能有一个活动连接。当第二个客户端调用'Start()'这将如何处理?或者在这种情况下,一次只能有一个“收集器”。因此,一次只有一个客户端可以从Controller中获取数据? **我有一个想法:**要有多个客户端,是否有可能在主机启动时运行'Collector',并让客户端使用WCF服务从这个'Collector'获取数据? – 2011-03-17 19:14:00

+0

请参阅编辑我的回复。 – 2011-03-17 19:34:00

0

听起来像你对我需要一个Windows服务来托管(1)的代码,投票的硬件控制器和(2)的WCF服务主机。在这种情况下,服务管道代码(即继承ServiceBase和WCF服务主机的类)最好保存在服务exe文件中,以及可以从service exe中引用的类库中的实际功能。

我会这样做的方式是有一个后台组件轮询硬件控制器,并维护一个“当前状态”,该状态将被存储在内存中(也许作为一个单例)或存储在数据库中。然后编写WCF服务来查询呼叫进入时的当前状态。

HTH。