Шаблон AutoMapper нарушает принцип DDD? - PullRequest
0 голосов
/ 31 марта 2020

Я недавно пробовал фреймворк Abp и с радостью обнаружил, что это замечательная реализация DDD. Но так как он использует AutoMapper для преобразования DTO в сущности / агрегаты, я заметил, что он способен закорачивать мои частные установщики агрегатов, что явно нарушает основное правило DDD. Хотя цель AutoMapper состоит в том, чтобы уменьшить ручные операции, но DDD подчеркивает инвариант с помощью частных сеттеров.

Как я могу прояснить две, казалось бы, противоречивые концепции и плавно использовать эту платформу? Означает ли это, что я должен отказаться от AutoMapper, чтобы сохранить принципы DDD или наоборот?

Я считаю, что AutoMapper не является анти-паттерном DDD, поскольку он очень популярен в сообществе. Другими словами, если AutoMapper может использовать рефлексию (как я знаю) для установки частных сеттеров, это может сделать кто угодно. Означает ли это, что частные сеттеры по сути небезопасны?

Спасибо, что кто-нибудь может мне помочь или подсказать.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

AutoMapper - это: Обозначение объекта-объекта на основе соглашения в. NET.

Сам по себе AutoMapper не нарушает принцип DDD. Возможно, именно так вы его и используете.

Как я могу прояснить две, казалось бы, противоречивые концепции и плавно использовать эту структуру? Означает ли это, что я должен отказаться от AutoMapper, чтобы сохранить DDD принципы или наоборот?

Нет, вам не нужно отказываться от AutoMapper.
Вы можете указать .IgnoreAllPropertiesWithAnInaccessibleSetter для каждая карта.

Связанный: Как настроить AutoMapper для глобального игнорирования всех свойств с недоступным установщиком (частным или защищенным)?

Другими словами, если AutoMapper может использовать отражение (как я знаю) для установки частных сеттеров, любой может. Значит ли это, что частные сеттеры по сути небезопасны?

Нет, это означает, что отражение очень мощное.

1 голос
/ 31 марта 2020

Не знаю много о фреймворке Abp. Частные сеттеры - это просто старый добрый традиционный OOP, который используется в DDD (инкапсуляция). Вы должны выставить publi c методы из вашего агрегата, которые изменят его состояние. Automapper можно использовать на уровне приложения, где вы отображаете DTO на строительные блоки домена (например, объекты-значения) и передаете их как параметры в агрегатные функции publi c, которые изменяют свое собственное состояние и применяют инварианты. Сказав, что не все любят Automapper:)

...