我正在寻找使用客户端/服务器模型创建功能丰富的应用程序,使用WCF作为可能的通信框架。
我将在Windows服务中托管服务(因此使用WCF我会使用netTcpBinding)。
现在,我想我可以将每个服务操作定义为单个服务合同,但可能会有相当多的操作,我宁愿将它们分成几个有凝聚力的服务合同。
将我的操作拆分为一组服务合同是否意味着我必须在单独的端口上托管每项服务? (这不太理想,因为我更喜欢在一个端口上运行它。)
有关此方案的任何设计提示?谢谢:))
更新
很抱歉任何混淆 - 我不打算在不同的合同中托管每个每个服务操作,只是为了明智地对它们进行分组。我的问题源于这样一个事实:我认为不可能在一个端口上托管多个ServiceHosts。
< slaps额头>
Joe说,可以在一个端口上简单地托管多个服务主机。我想在我最初尝试这个时,我一定误解了一条异常消息。如果我能让这个工作,那么我认为这将是我最喜欢的解决方案。
我认为@Koystya和co在单个具体对象上实现每个接口并将其托管在单个ServiceHost中的方法对我的问题也是一个很好的实用解决方案。特别是如果您将单个具体对象视为一种Facade。我可以想到的一个缺点是,根据合同,你将无法拥有不同的ServiceBehaviors。
另外,我同意Joe的逻辑,即什么时候适合在一个具体的类上实现多个服务合同。
答案 0 :(得分:2)
服务可以公开多个服务合同。
我将创建作为一个类实现的WCF服务,它本身实现了几个具有[ServiceContract]属性的接口。
答案 1 :(得分:2)
我想我可以将每个服务操作定义为单个服务合同,但可能会有相当多的操作,我宁愿将它们分成几个有凝聚力的服务合同。
将运营分组为有凝聚力的服务合同是有意义的。粒度(例如,每个服务合同的操作数量)将取决于您的应用程序,但每个操作的一个服务合同似乎极端。
将我的操作拆分为一组服务合约意味着我必须在一个单独的端口上托管每项服务
完全没有,你可以在同一个端口上拥有多个服务合同。
您可以拥有一个实现多个服务合同as suggested by Koistya Navin .NET的具体类。但是:
这是一个内部实施细节。
如果操作合同实现密切相关,在单个类中实现它们,我只考虑这样做。
在这种情况下,将它们作为同一服务合同的一部分可能是有意义的。
答案 2 :(得分:1)
您为什么要考虑将每项业务纳入自己的服务合同?你打算从中获得什么?
基本上,服务合同可以根据需要标记[OperationContract]。这可能更有意义。
如果您有不同的功能,您可以随时定义多个ServiceContract(作为接口),并让您的服务类实现它们并将一个服务类(具有所有ServiceContract接口)托管在一个地址上(包括端口)。
[ServiceContract]
public interface IMyService1
{
[OperationContract]
void SomeOperation1;
[OperationContract]
void SomeOperation2;
}
[ServiceContract]
public interface IMyService2
{
[OperationContract]
void SomeOperation21;
[OperationContract]
void SomeOperation22;
}
public class MyServiceClass : IMyService1, IMyService2
{
void SomeOperation1;
void SomeOperation2;
void SomeOperation21;
void SomeOperation22;
}
马克
答案 3 :(得分:0)
正如@Koistya所写,这是有可能的。 这是一个完整的例子:example。