Nano Hash - криптовалюты, майнинг, программирование

Действительная модель домена при использовании Automapper

Я использую прекрасный Automapper Джимми Богарда для сопоставления моей модели API с классами POCO (модель предметной области). Модель API не содержит определенных атрибутов модели предметной области, которые необходимы для того, чтобы модель предметной области находилась в допустимом состоянии. В этом сценарии, когда Automapper завершает свою работу, у меня есть полностью построенная модель предметной области в недопустимом состоянии. Не использовать Automapper не вариант, потому что слишком много атрибутов для передачи кода.

Вот мой вопрос:

Как использовать automapper для создания объекта таким образом, оставляя модель предметной области в допустимом состоянии.

Спасибо


  • Вы не знаете. Automapper не предназначен для такого использования 28.04.2016

Ответы:


1

Наверное, это слишком долго для комментария:

Хотя ответ Джимми правильный, он может означать, что ваш дизайн может быть не настолько инкапсулирован, как мог бы быть, поскольку вам придется выставлять много состояний. Возможно, поэтому есть комментарии вокруг «анемичных» моделей и «не соответствующих назначению».

Если вы сосредоточены на поведении, то у вас может быть что-то совершенно гипотетическое, чтобы сделать вашего клиента золотым клиентом:

customer.MakeGold();

Однако при использовании состояния теперь вам придется предоставлять атрибуты, позволяющие сопоставлять статус Gold. Внутренне ваш клиент мог проверить определенное другое состояние, чтобы определить действительность статуса Gold, в то время как эта проверка достоверности теперь перемещена за пределы домена, как Джимми говорит, что он что состояние правильное, прежде чем передать его в домен.

Это не столько проблема автомаппера, сколько проблема дизайна. Это также указывает на то, что ваша модель API/интеграции может быть более ориентированной на данные.

С другой стороны, если вы сопоставляете, скажем, объекты значений в командном стиле, которые передаются домену, это может быть не так плохо :)

// map my APIActivationDetails to Activate --- however automapper does this :)

var activate = AutoMapper.Map<Activate>().From(apiActivationDetails);

customer.Activate(activate);

Если подумать... кажется, это то, что Джимми говорит :P

29.04.2016
  • Да, это то, что я говорю. Но команда проверяется на границе приложения, которое также может просматривать объекты/агрегаты по мере необходимости. 29.04.2016

  • 2

    «чтобы сопоставить мою модель API с классами POCO (модель предметной области)»

    Зачем вам когда-либо хотеть сопоставлять атрибуты командного объекта (вашей модели API) с объектами предметной области? Если это то, к чему вы стремитесь, вы в основном получите чрезмерно спроектированный CRUD, но, конечно, не решение DDD.

    Поведение должно быть явно объявлено для агрегатов, а агрегаты несут ответственность за изменение своего внутреннего состояния в соответствии с бизнес-инвариантами, которые они защищают.

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

    Вы не должны пытаться запихивать данные в агрегаты, вместо этого вы должны попросить их выполнить задачу.

    29.04.2016
  • Однако внутри своего домена вы, безусловно, можете использовать AutoMapper, когда это имеет смысл. Обычно я этого не делаю. 29.04.2016
  • У вас есть пример, где это имеет смысл? 29.04.2016
  • Если я просто редактирую данные и не делаю чего-то ужасно поведенческого. Редактирование счета или утверждение счета. 29.04.2016
  • @JimmyBogard Что ж, редактирование счета-фактуры также может быть последовательностью поведенческих операций: LineItemQuantityAdjusted, LineItemRemoved и т. д. Если вы не улавливаете намерение, вы просто делаете CRUD. CRUD может быть хорош, но тогда ему вообще не требуется модель предметной области. 29.04.2016

  • 3

    Я проверяю модель API перед ее сопоставлением с моей моделью предметной области, независимо от того, использую я AutoMapper или нет. Модель API представляет собой команду или действие, поэтому я проверяю команду перед тем, как применить ее к своей сущности, а не изменяю свою сущность, а затем пытаюсь ее проверить. Это также означает, что все мои атрибуты проверки находятся в моей модели API.

    28.04.2016
  • Значит, вы предпочитаете не всегда валидные анемичные модели предметной области? 28.04.2016
  • Нет, я проверяю команды до того, как они попадут в мою модель предметной области, поэтому моя модель предметной области всегда действительна. 29.04.2016
  • Я согласен с тем, что есть некоторые тривиальные проверки, которые можно выполнить в командах, но роль агрегатов заключается в защите инвариантов. 29.04.2016
  • Итак, вы можете заставить свои агрегаты выполнять валидацию, но я предупреждаю вас, фреймворки валидации делают валидацию очень хорошо, а объекты, свернутые вручную, — нет, а появление ошибок валидации внутри сущностей/агрегатов ужасно. Удовлетворение инвариантов не обязательно связано с выполнением проверки - это правильное состояние. 29.04.2016
  • Модель предметной области предназначена для эффективного выражения бизнес-логики и защиты инвариантов. Инварианты, зависящие от состояния бизнеса, принадлежат агрегатам. Я бы даже пошел дальше и сказал, что большинство правил проверки принадлежат домену (например, наличие объекта значения имени пользователя для обеспечения соблюдения форматов имени пользователя). Однако, хотя эти методы моделирования очень эффективны для обеспечения соблюдения политик, они не предназначены для отчетов об ошибках. По этой причине платформы проверки можно использовать либо в пользовательском интерфейсе, либо на уровне приложений для выполнения проверок, которые в большинстве случаев не зависят от состояния бизнеса. 29.04.2016
  • Этот подход приводит к некоторому дублированию тривиальных правил, но я не считаю это дублированием, потому что цель совсем другая. Модель предметной области защищает состояние бизнеса, а проверки пользовательского интерфейса и прикладного уровня помогают пользователю выполнять свои задачи. 29.04.2016
  • Мои правила проверки находятся в моем домене. Мой домен состоит из валидаторов, обработчиков и сущностей. Я просто не помещаю свою проверку в свои сущности, это становится противным. И я не дублирую эти правила, все в моей системе проходит через команды и запросы, но правила ДОЛЖНЫ быть связаны с командами. 29.04.2016
  • Это один из способов взглянуть на это, но это не то, что является всегда верной парадигмой. codebetter.com/gregyoung/2009/05/22/always-valid 29.04.2016
  • Ну удачи! Мы как бы выбрали то, что легко/возможно в C#/.NET, и то, что мы могли бы эффективно предотвратить с помощью проверки кода запроса на вытягивание. 01.05.2016
  • Поэтому мне интересно, действительно ли речь идет о применении входящего запроса к модели предметной области или восстановлении состояния модели предметной области? Если я защищаю свою модель предметной области так, как описывает plalx (что я предпочитаю), я все равно сталкиваюсь с проблемой восстановления состояния объекта (например, из базы данных). У модели есть частные сеттеры, поэтому я не могу десериализовать, поэтому мне остается делать что-то вроде метода .LoadFromState с методом .GetState. Я на самом деле пытаюсь выяснить, могу ли я хотя бы использовать AutoMapper там как-то 21.03.2019
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..