您的位置:首页 > 其它

WCF 学习笔记(契约分解)

2011-04-13 22:48 405 查看
一.摘要

WCF 服务契约的分解与设计,服务契约中该定义那些操作,每个契约又应该包含那些操作,解决这些问题与WCF技术并无太大关系,更多地属于抽象的面向服务分析与设计的范畴。

二.前言

一个服务契约是逻辑相关的操作的组合。所谓的”逻辑相关”通常指特定的领域逻辑。我们可以将服务契约想象成实体的不同表现。



三 案例

namespace Jackyong.Animal.solution

{

[ServiceContract]

interface IDog

{

[OperationContract]

void Fetch();

[OperationContract]

void Bark();

[OperationContract]

long GetVetClinicNumber();

[OperationContract]

void Vaccinate();

}

}

上面的代码Idog服务契约的定义并没有体现职责分离的原则。虽然这些操作都是狗所应具有的,但是Fetch()和Break()方法与Idog服务契约的逻辑关联性,远远强于GetVetClinicNumber()和Vaccinate()方法,Fetch()和Bark()体现了狗的本性,它的日常生活有关,属于示例化的犬类实体的职责。GetVetClinicNumber()和Vaccinate()则体现了不同的特性,他们与兽医诊所的宠物记录有关,一个最佳方案是将GetVetClinicNumber()和Vaccinate操作分解出来,形成一个单独的Ipet契约。

[ServiceContract]

interface Ipet

{

[OperationContract]

long GetVetClinicNumber();

[OperationContract]

void Vaccinate();

}

[ServiceContract]

interface IDog

{

[OperationContract]

void Fetch();

[OperationContract]

void Bark();

}

由于宠物的职责不依赖与犬类实体,因此其他实体,可以重用一下实体Ipet服务

class PoodleService : IDog, Ipet

{

public void Fetch()

{

throw new NotImplementedException();

}

public void Bark()

{

throw new NotImplementedException();

}

public long GetVetClinicNumber()

{

throw new NotImplementedException();

}

public void Vaccinate()

{

throw new NotImplementedException();

}

}

class SiameseService : ICat, Ipet

{

public long GetVetClinicNumber()

{

throw new NotImplementedException();

}

public void Vaccinate()

{

throw new NotImplementedException();

}

public void Purr()

{

throw new NotImplementedException();

}

public void CatchMouse()

{

throw new NotImplementedException();

}

}

契约的分解实现了应用程序中诊所管理职责与实际服务(猫或者狗) 之间的解耦。将操作分解为单独的接口,是服务设计中常见的做法,它能降低操作之间的逻辑关系。但是有时候在几个不相关的契约中会找到相同的操作,这些操作与他们各自的契约存在一定的逻辑关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: