jri*_*sta 12 .net wcf soa contract-first
在实际情况中,这个问题更多的是探索人们在社区中所做的事情,而非特定目标问题.我已经对此进行了广泛的搜索,虽然我发现许多博客主张提出契约优先服务设计并且有一些评论支持它们,但我还没有找到关于实施与WCF合同优先的实用信息,优缺点我在最近对SOA进行了一些广泛的研究,主要是通过Thomas Erl的书籍,他提倡的主要概念之一是契约优先设计.
我的问题如下:
合同优先发展的主要问题之一似乎是工具.Svcutil是我发现的唯一可以从合同生成服务代码的东西,它有一些非常差的输出.它的单个文件,充满了属性和代码生成工件,它基本上需要在合同更新时重新生成和替换.我更喜欢更好的方法,最好是不需要再生更换的方法.我甚至可以手动创建服务端合同,假设它在实际场景中是实用的.
编辑:
我使用契约优先方法,通常(但不总是)在每一端使用相同的类型表示.
实际上,要使用WCF,您不需要任何特殊代理等; 你可以在两端使用普通的.NET类型,而不是用svcutil.exe 在所有.获得工作服务就像在配置文件中添加"ABC"一样简单,并使用如下内容:
public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
where T : class
{
public T Service { get { return base.Channel; } }
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用:
using(var client = new WcfClient<IMyService>()) {
int i = client.Service.SomeMethod("abc");
}
Run Code Online (Sandbox Code Playgroud)
你在客户端(和服务器)拥有的就是你的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);
}
Run Code Online (Sandbox Code Playgroud)
protobuf-net工具(我维护)包括一个"protogen"实用程序,用于将此DSL转换为C#/ VB; 其中一个选项(对于C#,至少 - 我需要检查VB)是发出一个完整的WCF代理实现(用你选择的同步或异步方法); 与svcutil非常相似 - 但是(由于protobuf-net关系)它[ProtoBehavior]在操作契约中包含自定义属性,因此它使用protobuf-net序列化器代替DataContractSerializer(更快,更高效,但不同).
对于VS集成; 我正在努力(证明).