本文转自 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
{...}