2011-06-25 40 views
4

我能请得到暴露我的业务对象复杂的WCF服务的一些澄清。比方说,我有4个对象:contactorganisationprojectletterWCF多个合同

是创造我的服务最好的办法:

  1. 让4个合约为“服务对象”,并通过对象和预期的操作值/参数中的“服务对象”?或
  2. 为所有对象及其功能(可能很多)创建合同?

非常感谢,

克里斯

+0

问这个问题的原因,目前我有一个名为contact_function1,contact_function2 ..... organisation_function1,organsiation_function2和我的服务文件变得相当长的服务中的所有功能。 –

回答

8

按照Interface Segregation Principle,你可能要考虑一下那些分裂的东西了。

一个典型的方法是将每个对象类型有一个接口(例如,一个“服务”) - 例如一个用于Contact的接口,包含所有需要的和对联系人有用的操作等。

当然,您可能也有处理多种不同类型对象的方法 - 这些方法对于放置在特定服务合约中有点棘手。

而且,与WCF,您可以轻松拥有一个单一的服务实现类,然后又将实现一次这些接口的多 - 例如使用通用代码或通用模式。

但我想这将是重新考虑你的服务合同,将其转换成更小,更易管理的块是个好主意。

更新:

如果你的服务实现类实现四个服务合同,那么你就必须配置它是这样的:

<services> 
    <service name="YourNamespace.YourServiceImplementation"> 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://YourServer/MyServices/" /> 
     </baseAddresses> 
    </host> 
    <endpoint name="Contact" 
     address="Contact" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IContactService" /> 
    <endpoint name="Letter" 
     address="Letter" 
     binding="basicHttpBinding" 
     contract="YourNamespace.ILetterService" /> 
    <endpoint name="Organisation" 
     address="Organisation" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IOrganisationService" /> 
    <endpoint name="Project" 
     address="Project" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IProjectService" /> 
    <endpoint name="mex" 
     address="mex" 
     binding="mexHttpBinding" 
     contract="IMetadataExchange" /> 
    </service> 
</services> 

现在,每个服务的可在一个特定端点:

  • IContractService可达在http://YourServer/MyServices/Contact
  • ILetterService可达在http://YourServer/MyServices/Letter

等等....

对于每一个这种地址的,你现在可以从客户端添加服务引用 - 只添加那些你真正需要的。一个应用可能只需要这些服务的单一,另一个可能需要两个或三个等

+0

感谢marc_s的回应。我已经尝试了每个对象的单独接口,但是当我使用VS10中的“添加服务引用”对话框时,我无法找到它们。我可以找到我的mex端点,但我只能配置我的app.config来显示一个接口/合同。如果我点击界面,我将显示其操作列表,但是如何在“添加服务参考”对话框中添加更多的服务树视图服务分支下的一种界面类型。 –

+1

您将在服务的配置文件中拥有单个服务(实现) - 但每个协议都可以公开不同的端点(=不同的服务地址)。所以你可以有一个单独的实现,但是公开了五个不同的端点(在五个不同的地址上) - 并且Add Service Reference将违背一个端点,所以它会一直向你显示那个单一合约的操作(例如' Contact')。如果你想使用所有五六个服务合同,你需要添加五个或六个服务引用(对每个端点) –

+0

我已经设法增加一个合同到一个服务,并且似乎都按照计划进行。感谢您的验证。我对自己了解合同是什么感到困惑。它是我的界面,而不是与界面相关的单个操作。我非常高兴谢谢你的时间 –

1

只需添加到由Marc非常有用的答案,该接口需要被装饰成以下,然后只,我们得到机会分别为服务实施的每份合同添加独立参考。

[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")] 
public interface IContractService 
{ 
    ... 
} 

同样,对于其他接口

[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")] 
public interface ILetterService 
{ 
    ... 
} 

无需添加这些属性,我无法单独的服务refernce添加到每个由公共服务实现的合同。