Visual studio 2008 初级WCF设置/实现设计方法

Visual studio 2008 初级WCF设置/实现设计方法,visual-studio-2008,wcf,wcf-client,Visual Studio 2008,Wcf,Wcf Client,有关VS2008中的解决方案,请参见下图,该解决方案在Cient和主机之间实现WCF。客户端是一个简单的Windows窗体应用程序,主机是一个控制台应用程序。我打算使用Windows服务作为主机,但为了简单和调试,目前我使用的是控制台应用程序 两者之间的通信是使用netNamedPipeBinding的DCCService(WCF部分);客户端和主机都将驻留在同一台计算机上。另外,我知道将WCF服务与主机分离是一种很好的做法,这样就可以轻松地更改主机,这在我的情况下是很好的 这是我的难题:客

有关VS2008中的解决方案,请参见下图,该解决方案在Cient和主机之间实现WCF。客户端是一个简单的Windows窗体应用程序,主机是一个控制台应用程序。我打算使用Windows服务作为主机,但为了简单和调试,目前我使用的是控制台应用程序

两者之间的通信是使用netNamedPipeBinding的DCCService(WCF部分);客户端和主机都将驻留在同一台计算机上。另外,我知道将WCF服务与主机分离是一种很好的做法,这样就可以轻松地更改主机,这在我的情况下是很好的


这是我的难题:客户将呼叫的工作应该在哪里完成

我希望我的服务所做的工作是在后台以设定的间隔不断轮询硬件控制器。而DCCService将方法公开给希望了解此数据的任何客户端

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

我想我缺少了一些基本的东西。我感谢你的帮助或建议。请让我知道,如果我需要更清楚


Ryan R.

在我看来,您需要一个Windows服务来承载(1)轮询硬件控制器的代码和(2)WCF服务主机。在这种情况下,服务管道代码(即继承ServiceBase和WCF服务主机的类)最好保存在服务exe中,实际功能保存在类库中,您可以从服务exe中引用

我要做的是有一个后台组件,它轮询硬件控制器并维护一个“当前状态”,该状态将存储在内存(可能作为一个单例)或数据库中。然后编写WCF服务,在调用传入时查询当前状态


HTH.

轮询设备的代码在逻辑上是WCF服务的一部分,而不是主机项目。代码是物理驻留在WCF服务项目中,还是驻留在WCF服务项目引用的类库中,这是个人的首选

我是这样做的

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

在同一个项目中,我有一个
收集器
类,它有一个私有构造函数,防止在类的作用域之外创建类的实例。该类有一个维护的
收集器的私有静态列表。该类还有两个静态函数-
Start()
Stop()

当客户端想要启动
收集器时,它会调用CollectionService的
start()
操作。此CollectionService依次调用static
Collector.Start()
函数,该函数创建一个
Collector
实例,并将其存储在
收集器的静态列表中。当客户端希望停止
收集器
时,它调用CollectionService的
stop()
操作,该操作转换为调用静态
Collector.stop()
函数,停止
收集器
,并将其从列表中删除

收集器
被实例化时,它将启动一个新线程,该线程开始收集数据并将其提供给相关方。新线程是关键。否则,
Collector
实例将简单地位于
Collector
列表中,而不做任何事情

因为我要处理线程,显然我必须处理同步问题,比如同步对
收集器的静态列表的访问。我不希望客户机试图启动
收集器,而其他人试图关闭它

简而言之就是这样

如果您还没有创建Windows服务,下面是我写的两篇SO文章,它们一步一步地说明了如何创建Windows服务

第一个链接基本上让你进入服务;第二个演示如何在不需要
InstallUtil
的情况下安装/卸载它

我希望这有帮助

编辑

如果只有一个
控制器
可以运行,那么启动
控制器
的后续调用可能会被忽略,可能会有一条返回消息指示它已经在运行

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

WCF中已经存在这样的发布-订阅框架。您可以在此处阅读详细信息:


您可以从Juval Lowy的网站免费下载此框架。我使用这个概念向感兴趣的各方发出CollectionService事件的信号。我希望您可以使用相同的概念向多个客户提供数据。

谢谢您的精彩回答。一个重要的警告是,控制器一次只能有一个活动连接。当第二个客户端调用
Start()
时,该如何处理?或者在这种情况下,一次只能有一个
收集器
。因此,一次只能有一个客户端从
控制器
获取数据?我有一个想法:要有多个客户机,是否可以在主机启动时运行
收集器
,并让客户机使用