代码之家  ›  专栏  ›  技术社区  ›  jrista

将第一个SOA与WCF签订合同

  •  12
  • jrista  · 技术社区  · 15 年前

    这个问题与其说是一个明确的目标问题,倒不如说是一个探索,以发现人们在社区中的实际情况。我已经广泛地搜索了这方面的内容,虽然我发现了许多主张契约优先服务设计的博客和一些支持它们的评论,但是我还没有找到很多关于首先与WCF实现契约的实用信息,在现实环境中这样做的优缺点等等。我最近做了一些广泛的工作。对SOA的研究,主要是通过ThomasErl的书,他提倡的主要概念之一是契约优先设计。

    我的问题如下:

    1. 您如何处理与.NET和WCF的契约优先服务设计?
    2. 除了svcutil之外,还有其他工具可以从契约中生成客户机和服务吗?(任何与vs集成的东西都是理想的)
    3. 在合同第一设计和WCF方面,您遇到了哪些现实世界的专业人员?
    4. 在合同优先设计和WCF中,您遇到了哪些实际的缺点?

    合同优先开发的主要问题之一似乎是工具。svcutil是我发现的唯一可以从契约生成服务代码的东西,它的输出非常差。它的单个文件,充满了属性和代码生成工件,并且它基本上需要在合同更新时重新生成和替换。我更喜欢一个更好的方法,最好是一些不需要更换再生剂的方法。我可以手动创建服务端契约,即使在现实场景中也是可行的。

    编辑:

    当wcsf解决了我的即时需求时,学习 Protocol Buffers Service Factory 这两个工具都很有趣,我相信将来会对我有所帮助。

    5 回复  |  直到 7 年前
        1
  •  15
  •   Cheeso    15 年前

    WSCF 提供具有vs集成的契约优先工具。结帐。(免费)

    截至7月6日,有一个带有安装程序的二进制版本。

        2
  •  5
  •   Marc Gravell    15 年前

    我使用契约优先的方法,通常(但不总是)在每一端使用相同的类型表示。

    实际上,要使用WCF,您不需要任何特殊的代理等;您可以在两端使用常规的.NET类型,而不使用 svcutil.exe 完全 . 获得一个可工作的服务很简单,只需将“abc”添加到配置文件中,然后使用如下方法:

    public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
        where T : class
    {
        public T Service { get { return base.Channel; } }
    }
    

    现在您可以使用:

    using(var client = new WcfClient<IMyService>()) {
        int i = client.Service.SomeMethod("abc");
    }
    

    你在客户机(和服务器)上所拥有的就是 IMyService 接口。


    对于其他工具,Protobuf NET是Google的“协议缓冲区”API的一个实现,它有一个DSL,用于以“契约优先”(和可移植/互操作)的方式描述数据和服务,例如(一个.proto文件):

    message SearchRequest {
      required string query = 1;
      optional int32 page_number = 2;
      optional int32 result_per_page = 3;
    }
    message SearchResponse {
      repeated string result = 1; 
    }
    service SearchService {
      rpc Search (SearchRequest) returns (SearchResponse);
    }
    

    Protobuf网络工具(我维护)包括一个“Protogen”实用程序,用于将此DSL转换为C/vb;,其中一个选项(对于C,至少-我需要检查vb)是发出一个完整的wcf代理实现(您可以选择同步或异步方法);与svcutil非常相似-但是(由于Protobuf网络关系),它包括自定义的 [ProtoBehavior] 操作协定的属性,以便它使用protobuf net序列化程序而不是 DataContractSerializer (更快更高效,但不同)。

    对于vs集成;我正致力于( proof )

        3
  •  3
  •   Emil    11 年前

    我更喜欢合同优先开发。我已经用过了 Service Factory 为此目的。它允许我在不进行自定义的情况下生成服务和客户机代码。

    定制时,我们还能够生成与实体框架对象对应的数据传输对象,以及从一个对象转换到另一个对象的代码;自动记录异常;以及服务的HTML文档。

    这是服务工厂随附的代码分析规则的补充,这些规则有助于防止开发人员通过选择不兼容的WCF选项而自鸣得意。

        4
  •  2
  •   Ray Mendonsa    15 年前

    在WCF中,“契约优先”看起来有一些多样性。您可以执行“代码协定优先”,其中数据和服务协定表示为具有正确属性标记的.NET类型。您可以从WSDL开始并生成服务和数据契约,也可以从数据契约的XML模式开始,并将服务契约表示为代码。你走哪条路真正取决于合同的性质以及如何使用。

    如果您要实现某种东西到WSDL规范,那么从WSDL生成代码是一个显而易见的选择,从手工生成并不是什么大问题。如果希望立即传播对WSDL文件的更改,则可以从项目生成事件(或进入msbuild)触发生成。

    如果您有要用作数据协定的现有架构(XSD),或者更愿意以这种方式开发数据协定,以便在其他平台中更容易地重用,则可以使用xsd.exe(或第三方替代方案)从架构生成类型。在这种情况下,您可以在面向代码的服务契约中使用XML可序列化类型,例如 this :

    如果您自己在.NET中开发客户机和服务器,并且您的客户机既可以获取合同程序集,也可以从服务元数据(如WSDL)中愉快地生成客户机,那么用代码建模合同是一种很好的体验。使用“已知类型”方案,您可以在数据契约中支持继承模型,这是非常强大的。通过直接引用客户机中的合同程序集,可以跳过完全生成客户机代码(如其他答复中所述)。它非常高效和优雅,但是您需要知道,如果您过于花哨,您可以创建互操作挑战。

        5
  •  0
  •   Shiraz Bhaiji    11 年前

    我们这样做的方式在本视频中描述:

    http://www.dnrtv.com/default.aspx?showNum=103

    我们的想法是不使用代码生成,因此避免了在合同更改时重新生成代码。

    然后契约以代码形式存在,并且可以更改,如果客户机和服务器之间不匹配,它将在生成错误中显示。