WCF 学习笔记(契约分解)
一.摘要
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();
}
}
契约的分解实现了应用程序中诊所管理职责与实际服务(猫或者狗) 之间的解耦。将操作分解为单独的接口,是服务设计中常见的做法,它能降低操作之间的逻辑关系。但是有时候在几个不相关的契约中会找到相同的操作,这些操作与他们各自的契约存在一定的逻辑关系。
出处:http://www.cnblogs.com/liuyong/
作者喜欢研究 Sql Server ,ASP.NET MVC , Jquery WCF 等技术,同时关心分布式架构的设计应用。转载请保留原文链接,谢谢!