Концепции DDD в разработке N-Layer

Потратив пару месяцев на изучение методологии DDD, я начал применять эти концепции в реальных продуктах своей компании. На самом деле, мне было поручено создать подходящую и поддерживаемую архитектуру для будущего развития.

Мы решили использовать следующие технологии: EF4 (действительно v2), Unity

Объем информации, который я получил, оказался наиболее поучительным, однако в передовой практике у меня осталось несколько вопросов:

Вопрос № 1: DTOs - лучшие практики

У меня есть доменные объекты (классы POCO). Есть несколько способов реализовать эти классы.

  1. Традиционный подход: создание классов POCO, которые содержат общедоступные методы получения / установки, валидацию и соответствующую бизнес-логику. Также создайте DTO и используйте методы отображения для управления ими. (Automapper)
  2. Традиционный - DTO: Создайте классы POCO, как указано выше, однако используйте свои POCO в качестве объектов передачи. Я понимаю, что бизнес-объекты никогда не должны покидать домен.
  3. Гибрид: я наткнулся на интересное сообщение в блоге, в котором автор создает свои объекты POCO и DTO. Внутри своего доменного объекта он создает экземпляр DTO. Это упрощает обслуживание, поскольку вы не дублируете свои свойства, как в #1. Вот так:
открытый абстрактный класс POCOBase : ValidationBase, IPOCO, где T: DTOBase, new ()
{

 public T Data { get; задавать; }

 общедоступная POCOBase()
 {
     Данные = новый T();
 }

 общедоступная POCOBase(T dto)
 {
     Данные = dto;
 }
  }

  открытый класс SomePOCO: POCOBase { }

  открытый класс SomeDTO: DTOBase

  {

 public String Name { get; задавать; }

 public String Описание { get; задавать; }

 public Boolean IsEnabled { get; задавать; }
}


// ПРИМЕРЫ
// POCOBase  somePOCO = new SomePOCO ();
// somePOCO.Data.Name = "blablabla";
// somePOCO.Validate ();
// возвращаем somePOCO.Data;

Вопрос № 2: Какие объекты должны быть возвращены UI/Service Layer?

В этом весь смысл DTO. Очень простой, легкий объект, содержащий только голые атрибуты. Он также не содержит никаких результатов валидации. Если я сериализирую свои DTO обратно клиенту, следует предположить, что клиенту нужны какие-либо результаты валидации, такие как коллекция InvalidRules.

Например, скажем, я работаю с API Amazon. Я хотел бы добавить книгу в свой личный магазин. Если я попытаюсь добавить книгу, не отправляя свой ISBN, сервис, вероятно, вернет какую-то группу ответа, которая содержит ошибки результата проверки.

Я что-то пропустил? У меня сложилось впечатление (по крайней мере, от "пуристов" DDD), что DTO не должны содержать бизнес-логики. Мне кажется, что DTO не предоставляют достаточно информации в качестве объектов передачи. Либо это, либо мне нужен новый тип объекта Response, который инкапсулирует результаты DTO и проверки.

Вопрос № 3: Сколько IoC слишком много?

Мне кажется очевидным, что я должен следовать золотому правилу:

"Определите части приложения, которые различаются и отличаются от тех, которые остаются неизменными".

Для меня это имеет смысл с точки зрения применения IoC. Чтобы уменьшить зависимости, все уровни моей презентации, бизнес-логики и доступа к данным взаимодействуют через контейнер IoC. Мой уровень приложения содержит общие интерфейсы и абстракции. Кажется излишним использовать IoC гораздо больше, чем это. Мне нравится тот факт, что я могу создавать репозитории фиктивных тестов - и просто меняя конфигурацию Unity, я могу использовать TDD.

Надеюсь, я четко сформулировал эти вопросы. Заранее спасибо за помощь!

1 ответ

Решение

Я постараюсь ответить на ваши вопросы по одному.

Ответ 1

DTO ортогональны DDD, потому что они служат разным целям в разных местах в архитектуре приложения. Тем не менее, DTO нет места в доменной модели, потому что они не ведут себя и, следовательно, приведут к анемичным моделям доменов.

POCO с постоянством Невежество - это путь. У Джереми Миллера есть хорошая статья, которая объясняет эту концепцию.

Ответ 2

Слои, расположенные поверх модели предметной области, часто должны возвращать свои собственные объекты, адаптированные для рассматриваемой цели.

Для интерфейсов шаблон MVVM работает особенно хорошо. Эта статья представляет MVVM для WPF, но шаблон также работает как шарм в ASP.NET MVC.

Для веб-сервисов здесь применяется шаблон DTO. WCF Data Contracts - это DTO, если вам интересно:)

Это потребует много сопоставлений между интерфейсом сервиса и моделью домена, но это цена, которую вы должны заплатить за Supple Design. Вы можете найти AutoMapper полезным в этом отношении.

Ответ 3

Чем больше IoC (на самом деле: DI), тем лучше, но одна вещь в вашем вопросе поразила меня: Контейнер DI должен только связать граф объектов, а затем убраться с дороги. Объекты не должны полагаться на DI-контейнер.

Смотрите этот SO ответ для более подробной информации.

Другие вопросы по тегам