DDD, Антикоррупционный слой, как? - PullRequest
33 голосов
/ 26 мая 2009

На данный момент мы должны создать приложение, основанное на устаревшем. Код для этого старого приложения следует выбросить и переписать, но, как обычно, - вместо того, чтобы переписывать его, нам нужно основать на нем что-то новое. Недавно мы решили пойти по пути DomainDrivenDesign. Итак, антикоррупционный слой может стать решением наших проблем. Насколько я понимаю, таким образом должна быть возможность постепенно переписывать старое приложение.

Но - я не могу найти хорошего примера. Буду признателен за ЛЮБУЮ информацию.

Ответы [ 2 ]

31 голосов
/ 26 мая 2009

Из книга DDD (Доменно-управляемый дизайн: решение сложных задач в основе программного обеспечения) Эрика Эванса:

Публичный интерфейс АНТИКОРРУПЦИОННЫЙ СЛОЙ обычно появляется как набор УСЛУГ, хотя иногда это может принимать форму ENTITY.

и чуть позже

Один из способов организации дизайна АНТИКОРРУПЦИОННЫЙ СЛОЙ как сочетание ФАСАДОВ, АДАПТЕРОВ (оба от Gamma et al. 1995) и переводчики, наряду с механизмы связи и транспорта обычно нужно говорить между системы.

Итак, вы можете найти примеры, посмотрев предложенный рисунок адаптера и рисунок фасада .

Я попытаюсь перефразировать сказанное Эриком Эвансом: ваш антикоррупционный уровень будет отображаться как сервисы за пределами вашего уровня. Таким образом, за пределами антикоррупционного уровня другие слои не будут знать, что они «разговаривают» с антикоррупционным уровнем. Внутри слоя вы будете использовать адаптеры и фасады, чтобы обернуть ваши устаревшие источники информации.

Дополнительная информация об антикоррупционном слое:

11 голосов
/ 27 мая 2009

В моей конкретной реализации EmployeeAccessService вызывается из репозитория. Это действительно фасад в антикоррупционном слое. Он делегирует EmployeeAccessAdapter. Адаптер извлекает объект из устаревшей модели (которую он получает из EmployeeAccessFacade), а затем передает его в EmployeeAccessTranslator для преобразования объекта из устаревшей модели в объект домена в модели моего приложения.

EmployeeAccessService

public Employee findEmployee(String empID){
    return adapter.findEmployee(empID);
}

EmployeeAccessAdapter

public Employee findEmployee(String empID){
    EmployeeAccessContainer container = facade.findEmployeeAccess(empID);
    return translator.translate(container);
}

EmployeeAccessTranslator

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