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();

        }

    }

契约的分解实现了应用程序中诊所管理职责与实际服务(猫或者狗) 之间的解耦。将操作分解为单独的接口,是服务设计中常见的做法,它能降低操作之间的逻辑关系。但是有时候在几个不相关的契约中会找到相同的操作,这些操作与他们各自的契约存在一定的逻辑关系。

     

 

   

 

 

 

 

 

posted @ 2011-04-13 22:48  jackyong  阅读(342)  评论(0编辑  收藏  举报