WCF编写规范

本文转自 http://blog.csdn.net/dotnetsong博客空间,只是用于整理

 

通用设计指南
1、所有的服务必须遵循以下原则:
a、服务是安全的
b、服务在系统中应保持状态一致
c、服务是线程安全的
d、服务可以被并发客户端访问
e、服务是可靠的
f、服务是健壮的
 
2、服务应该遵循以下可选原则:
a、服务是可互操作的
b、服务的规模是不变的
c、服务是可用的
d、服务是及时响应的
e、服务是受限的,阻塞客户端的时间不能过长
 
3、避免消息契约

 

WCF基础
1、应该将服务代码放入到类库中,而不是放到宿主EXE中
2、不要为服务类提供参数构造函数,除非托管的服务是明确的单例服务
3、在相关的绑定中启用可靠性
4、要为契约提供有意义的命名空间,对于公开向外的服务,可以使用公司的URL或者等同的URL,然后加上年份和月份以避免版本冲突,如:
[ServiceContract (Namespace=http://www.idesign.net/2007/08)]
interface IMyContract
{...}
对于局域网服务,可以使用任何有意义的唯一的名称,如MyApplication,例如:
[ServiceContract (Namespace="MyApplication")]
interface IMyContract
{...}
5、对于运行在Windows XP以及Windows Server2003上的局域网应用程序,最好选用自托管,而不是IIS托管
6、在Windows Vista中,最好选用WAS(IIS7)托管,而不是自托管
7、使用ServiceHost<T>
8、启用元数据交换。
9、要为客户端配置文件中的所有终结点命名
10、不要使用SvcUtil或者Visual Studio 2005生成配置文件
11、不要复制代理的代码。如果两个或多个客户端使用相同契约,可以将代理分解到单独的类库中
12、总是关闭或释放代理

 

服务契约
1、总是将ServiceContractAttribute特性应用到接口上,而不是类上
//避免:
[ServiceContract]
class MyService
{
    [OperationContract]
    public void MyMethod()
    {...}
}
 
//正确:
[ServiceContract]
interface IMyContract
{
    [OperationContract]
    void MyMethod();
}
class MyService:IMyContract
{
     public void MyMethod()
     {...}
}
 
2、服务契约要添加前缀I:
[ServiceContract]
interface IMyContract
{...}
 
3、避免准属性(Property-Like)操作
//避免
[ServiceContract]
interface IMyContract
{
    [OperationContract]
    string GetName();
 
    [OperationContract]
    void SetName(string name);
}
 
4、避免定义只有一个成员的契约
5、每个服务契约最好只定义三到五个成员
6、每个服务契约的成员不要超过20个。12个是可能的实际限定

 

数据契约
1、只在属性或只读公有成员上使用DataMemberAttribute属性
2、避免为定制类型显示地执行XML序列化
3、当使用DataMemberAttribute特性的Order属性时,应该为同一类层级的所有成员分配相同的值。
4、数据契约应事先IExtensibleDataObject接口
5、避免在ServiceBehavior和CallbackBehavior特性上设置IgnoreExtensionDataObject。应保持它的默认值false
6、不要将委托和事件标记为数据成员
7、不要将.NET的特殊类型,例如Type作为操作的参数
8、不要在操作中接收或返回ADO.NET的DataSet类型和DataTable类型(或者它们的类型安全子类)。应该返回一个与技术无关的表示形式,例如数组
9、禁止为泛型的类型参数生成哈希值,而应该提供易懂的类型名
10、避免使用SvcUtil的/ct开关或者其他跨越服务边界的共享程序集类型的方法
 
实例管理
1、最好使用单调实例模式
2、避免使用会话服务
3、如果契约选择使用SessionMode.Required,则应显示地将服务实例设置为InstanceContextMode.PerSession
4、如果契约选择使用SessionMode.NotAllowed,则应将服务实例配置为InstanceContextMode.PerCall
5、不要在相同的服务上混合使用会话契约与单调契约
6、避免使用单例服务,除非该服务本质上就是单例的
7、要为会话服务使用有序传递
8、避免为会话服务停止实例
9、避免使用分布操作
 
操作与调用
1、不要将单向调用设置为异步调用
2、不要将单向调用设置为并发调用
3、单向操作不应该包含异常
4、为单向调用启用可靠性。对于单向调用而言,使用有序传递属于可选项
5、避免在会话服务中定义单向操作。如果定义了,则应将它定义为终止操作
[ServiceContract(SessionMode=SessionMode.Required)]
interface IOrderManager
{
    [OperationContract]
    void SetCustomerId(int customerId);
 
    [OperationContract(IsInitiating=false)]
    void AddItem(int itemId);
 
    [OperationContract(IsInitiating=false)]
    decimal GetTotal();
 
    [OperationContract(IsOneWay=true,IsInitiating=falting,IsTerminating=true)]
     void ProcessOrders()
}
6、为服务端的回调契约取名时,应使用服务契约名加上Callback后缀:
interfaxe IMyContractCallback
{...}
 
[ServiceContract(CallbackContract=typeof(IMyContractCallback))]
interface IMyContract
{...}
7、尽量将回调操作标记为单向
8、只为回调使用回调契约
9、避免在相同的回调契约中将常规的回调与事件混为一谈
10、事件操作的设计应遵循如下规范:
    a、void返回类型
    b、没有out参数
    c、标记为单向操作
11、避免在事件管理中使用原来的回调契约,而应该使用发布-订阅框架
12、避免为回调显式地定义创建(Setup)方法和销毁(Teardown)方法
[ServiceContract(CallbackContract=typeof(IMyContractCallback))]
interface IMyContract
{
    [OperationContract]
    void DoSomething();
  
    [OperationContract]
    void Connect();
 
    [OperationContract]
    void Disconnect();
}
 
interface IMyContractCallback
{...}
 
13、使用类型安全的DuplexClientBase<T,C>,而不是DuplexClientBase<T>
14、使用类型安全的DuplexChannelFactory<T,C>,而不是DuplexChannelFactory<T>
15、调试在局域网部署基于WSDualHttpBinding绑定的回调时,应该使用CallbackBaseAddressBehaviorAttribute特性,并将CallbackPort设置为0:
[CallbackBaseAddressBehavior(CallbackPort=0)]
class MyClient:IMyContrackBack
{...}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值