DDD,Anti Corruption层,操作方法?

Arn*_*psa 34 architecture legacy rewrite domain-driven-design

目前,我们必须构建一个基于遗留应用程序的应用程序.旧应用程序的代码应该被丢弃并重写,但通常情况下 - 而不是重写它,我们需要在它上面添加新内容.最近,我们决定采用DomainDrivenDesign路径.所以 - 反腐败层可以解决我们的问题.据我所知,这种方式应该可以逐步重写旧的应用程序.

但是 - 我找不到任何好的例子.我很感激任何信息.

Dav*_*man 33

来自Eric Evans DDD书(领域驱动设计:解决软件核心中的复杂性):

ANTICORRUPTION LAYER的公共界面通常显示为一组服务,但偶尔也可以采用ENTITY的形式.

稍后

组织ANTICORRUPTION LAYER设计的一种方法是将FACADES,ADAPTERS(均来自Gamma et al.1995)和翻译器以及通常需要在系统之间进行通信所需的通信和传输机制相结合.

因此,您可以通过查看建议的适配器模式外观模式来查找示例.

我将尝试解释Eric Evans所说的内容,您的反腐败层将作为服务层出现在您的图层外部.因此,在反腐败层之外,其他层不会知道他们正在与反腐败层"说话".在图层内部,您将使用适配器和外墙来包装旧的信息源.

有关反腐败层的更多信息:

  • 链接构建经常需要的反腐败层(http://joeydotnet.com/blog/archive/2007/09/10/building-the-often-needed-anti-corruption-layer.aspx)和DDD - 反腐败层(http://www.goeleven.com/blog/entryDetail.aspx?entry=168)坏了 (3认同)

小智 12

在我的特定实现中,EmployeeAccessService由Repository调用.它实际上是反腐败层面的一个外观.它委托给EmployeeAccessAdapter.适配器从遗留模型(从EmployeeAccessFacade获取)中获取对象,然后将其传递给EmployeeAccessTranslator,以将对象从遗留模型转换为应用程序模型中的域对象.

EmployeeAccessService

public Employee findEmployee(String empID){
    return adapter.findEmployee(empID);
}
Run Code Online (Sandbox Code Playgroud)

EmployeeAccessAdapter

public Employee findEmployee(String empID){
    EmployeeAccessContainer container = facade.findEmployeeAccess(empID);
    return translator.translate(container);
}
Run Code Online (Sandbox Code Playgroud)

EmployeeAccessTranslator

public Employee translate(EmployeeAccessContainer container){
    Employee emp = null;
    if (container != null) {
        employee = new Employee();
        employee.setEmpID(idPrefix + container.getEmployeeDTO().getEmpID());
        ...(more complex mappings)
Run Code Online (Sandbox Code Playgroud)