WCF 多重契约(Contract)

标签 wcf architecture

我能否对公开我的业务对象的复杂 WCF 服务进行一些澄清。假设我有 4 个对象:contact , organisation , projectletter .

是创建我的服务的最佳方式:

  • 将 4 个契约(Contract)作为“服务对象”并将对象和预期操作作为“服务对象”中的值/参数传递?或
  • 为所有对象及其功能(可能很多)创建合约?

  • 非常感谢,

    克里斯

    最佳答案

    根据Interface Segregation Principle ,你可能想考虑把这些东西分开。

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

    当然,您可能还拥有处理多种不同类型对象的方法——将这些方法放在特定的服务契约(Contract)中有点棘手。

    此外,使用 WCF,您可以轻松拥有一个服务实现类,然后一次实现多个这些接口(interface) - 例如使用通用代码或通用模式。

    但我想重新考虑您的服务契约(Contract)并将其转换为更小、更易于管理的 block 是一个好主意。

    更新:

    如果你的服务实现类实现了四个服务契约,那么你必须像这样配置它:

    <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 联系

  • 等等....

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

    关于WCF 多重契约(Contract),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6476158/

    相关文章:

    c# - 防止 WCF 回调出现异常

    WCF应用程序启动事件

    php - Rackspace 云文件容器的元数据搜索功能?

    java - Android 应用程序和 (Android) 库存档

    php - 作为一个 sql 脚本(带有内部联接)运行 sql 查询 vs 多个脚本同时在数组中操作它们

    architecture - "Skipping incompatible"在 Blue Gene 机器上

    C# 非静态字段、方法或属性需要对象引用 'HttpContext.Request'

    wcf - 工作流服务中的HandleError vs. ProvideFault不一致,如何处理?

    wcf - 如何使用 WCF 自托管处理 Ajax JQUERY POST 请求

    architecture - 将ARM指令转换为i386指令