目前,我们必须构建一个基于遗留应用程序的应用程序。旧应用程序的代码应该被丢弃并重写,但通常情况下 - 我们不需要重写它,而是需要在它的基础上添加一些新的东西。最近,我们决定走 DomainDrivenDesign 路径。所以——反腐败层可以解决我们的问题。据我了解,这种方式应该可以逐步重写旧应用程序。
但是——我找不到任何好的例子。我将不胜感激任何信息。
目前,我们必须构建一个基于遗留应用程序的应用程序。旧应用程序的代码应该被丢弃并重写,但通常情况下 - 我们不需要重写它,而是需要在它的基础上添加一些新的东西。最近,我们决定走 DomainDrivenDesign 路径。所以——反腐败层可以解决我们的问题。据我了解,这种方式应该可以逐步重写旧应用程序。
但是——我找不到任何好的例子。我将不胜感激任何信息。
来自Eric Evans的 DDD 书(领域驱动设计:解决软件核心的复杂性) :
ANTICORRUPTION LAYER 的公共接口通常以一组服务的形式出现,尽管有时它可以采用实体的形式。
稍后
组织 ANTICORRUPTION LAYER 设计的一种方法是结合 FACADE、ADAPTERS(均来自 Gamma 等人 1995)和转换器,以及通常需要在系统之间进行通信的通信和传输机制。
我将尝试解释 Eric Evans 所说的话,您的反腐败层将作为服务出现在您的层之外。因此,在反腐败层之外,其他层将不知道他们正在与反腐败层“说话”。在该层内部,您将使用适配器和外观来包装您的遗留信息源。
有关反腐败层的更多信息:
在我的特定实现中,EmployeeAccessService 由存储库调用。它实际上是反腐败层的一个门面。它委托给 EmployeeAccessAdapter。适配器从遗留模型中获取一个对象(它从 EmployeeAccessFacade 获得),然后将其传递给 EmployeeAccessTranslator 以将对象从遗留模型转换为我的应用程序模型中的域对象。
员工访问服务
public Employee findEmployee(String empID){
return adapter.findEmployee(empID);
}
员工访问适配器
public Employee findEmployee(String empID){
EmployeeAccessContainer container = facade.findEmployeeAccess(empID);
return translator.translate(container);
}
员工访问翻译
public Employee translate(EmployeeAccessContainer container){
Employee emp = null;
if (container != null) {
employee = new Employee();
employee.setEmpID(idPrefix + container.getEmployeeDTO().getEmpID());
...(more complex mappings)