WCF多重合同

时间:2011-06-25 05:55:17

标签: wcf architecture

我是否可以对公开我的业务对象的复杂WCF服务做一些澄清。假设我有4个对象:contactorganisationprojectletter

是创建服务的最佳方式:

  1. 将4个合约作为“服务对象”,并将对象和目标操作作为值/参数传递给“服务对象”?或
  2. 为所有对象及其功能(可能很多)创建合同?
  3. 非常感谢,

    克里斯

2 个答案:

答案 0 :(得分: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
  • 到达

依旧......

对于每个地址,您现在可以从客户端添加服务引用 - 仅添加您真正需要的服务引用。一个应用程序可能只需要一个服务,另一个可能需要两个或三个等。

答案 1 :(得分:1)

只是为了添加Marc非常有用的答案,接口需要按照下面的方式进行修饰,然后我们才有机会为服务分别实施的每个合同添加一个独立的引用。

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

与其他界面类似

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

如果不添加这些属性,我无法为公共服务实施的每个合同添加单独的服务引用。