您的位置:首页 > 其它

DDD:四色原型中Role的 “六” 种实现方式

2013-08-28 08:15 429 查看

背景

一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责。四色原型、DIC和“UML事物模式”在不同的维度阐述了这一情况,在代码层面到底该如何表达呢?本文给出了一些思路。

六种实现方式

因为:MI(Manufacture和QualityTesting)和Context(ManufactureContext、QualityTestingBeginningContext和QualityTestingCompletingContext)都是空实现且每种风格中的代码都一样,后面只给出跟PPT和Role相关的代码。

第一种:未显式体现角色的模式。

类图



代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V1
{
class Product
{
public void CompleteManufacture(ManufactureContext context) { }

public void BeginQualityTesting(QualityTestingBeginningContext context) { }

public void CompleteQualityTesting(QualityTestingCompletingContext context) { }
}
}


第二种:使用“显式接口”显式体现角色的模式。

类图



代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V2
{
interface IManufactureProduct
{
void CompleteManufacture(ManufactureContext context);
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V2
{
interface IQualityTestingProduct
{
void BeginQualityTesting(QualityTestingBeginningContext context);

void CompleteQualityTesting(QualityTestingCompletingContext context);
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V2
{
class Product : IManufactureProduct, IQualityTestingProduct
{
void IManufactureProduct.CompleteManufacture(ManufactureContext context) { }

void IQualityTestingProduct.BeginQualityTesting(QualityTestingBeginningContext context) { }

void IQualityTestingProduct.CompleteQualityTesting(QualityTestingCompletingContext context) { }
}
}


第三种:使用“扩张方法”显式体现角色的模式。

类图



代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V3
{
static class ManufactureProductExtentions
{
public static void CompleteManufacture(this Product that, ManufactureContext context) { }
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V3
{
static class QualityTestingProductExtentions
{
public static void BeginQualityTesting(Product that, QualityTestingBeginningContext context) { }

public static void CompleteQualityTesting(Product that, QualityTestingCompletingContext context) { }
}
}


第四种:使用“领域服务”显式体现角色的模式。

类图



代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V4
{
class ManufactureProductService
{
public void CompleteManufacture(Product product, ManufactureContext context) { }
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V4
{
class QualityTestingProductService
{
public void BeginQualityTesting(Product product, QualityTestingBeginningContext context) { }

public void CompleteQualityTesting(Product product, QualityTestingCompletingContext context) { }
}
}


第五种:使用“包装类型”显式体现角色的模式。

类图



代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V5
{
class ManufactureProduct
{
private Product _product;

public ManufactureProduct(Product product)
{
_product = product;
}

public void CompleteManufacture(ManufactureContext context) { }
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DCIStudy.V5
{
class QualityTestingProduct
{
private Product _product;

public QualityTestingProduct(Product product)
{
_product = product;
}

public void BeginQualityTesting(QualityTestingBeginningContext context) { }

public void CompleteQualityTesting(QualityTestingCompletingContext context) { }
}
}


第六种:使用“动态代理”显式体现角色的模式。

时间不够了,这种实现方式需要独立写一篇文章。

如何设计Context?

PPT对应的Role会参与到一个到多个Context中,一般来说一个Context涉及一个MI,如果MI为“Moment”,多数情况需要一个Context,如果MI为“Interval”,多数情况需要两个Context,根据MI的业务生命周期不同,所需的Context也不同。

备注

仓促写完,还没有具体深入分析如何做出不同的选择和折中,群里有朋友实战过,有机会再写一篇这样的文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: