Архитектура с AutoMapper? - PullRequest
       21

Архитектура с AutoMapper?

1 голос
/ 16 декабря 2010

Я создаю приложение ASP.NET MVC, в котором я использую следующий поток:

Получить Entity

  1. Выполнить действие на контроллере
  2. Извлечение данных из FactoryClass, который работает с моделью (Entity Framework)
  3. Получить данные обратно к действию в контроллере
  4. Использование AutoMapper для перевода из объекта Model в объект ModelView
  5. Вернуть объект ModelView в строго типизированное представление

Обновление объекта

  1. Запустить действие с Entity ModelView в качестве входных данных (будет использоваться DefaultDataBinder)
  2. Проверка сущности ModelView
  3. Отправьте объект ModelView непосредственно на правильный фабричный метод.
  4. Проверьте, есть ли у объекта ModelView идентификатор и, если да, извлеките объект Model из базы данных
  5. Используйте AutoMapper для преобразования входящего объекта ModelView в объект / объект Model. Если это обновление, используйте выбранный объект Model в качестве пункта назначения.
  6. Если это обновление, используйте Refresh Client. В других случаях используйте Add
  7. Запустите SaveChanges и вернитесь к контроллеру.

Задача 1

Классы ModelView специально созданы для представлений, с которыми связаны действия контроллера (они могут содержать как объекты, так и списки). Обычно несколько действий с различными представлениями используют один и тот же класс ModelView, что означает, что не все объекты в объекте ModelView будут использоваться в каждом действии / представлении.

Пока представление использует все свойства ModelViewObjects, которые могут быть обновлены, проблем нет, но ...

Скажем, что мы получили представление, в котором некоторые свойства ModelViewObject не используются, этот ModelViewObject отправляется на фабрику (будет обновляться), где выбирается соответствующий объект ModelObject (из структуры db / entity), а затем объединяется с ModelViewObject с AutoMapper. Проблема в том, что свойства ModelViewObject, которые не установлены (не используются в представлении), приведут к перезаписи реальных данных в ModelObject.

Чтобы решить эту проблему, обычно используйте AutoMapper ForMember Ignor (), но это будет проблемой, когда полный ModelViewObject (все установленные свойства) обновит БД.

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

Было бы неплохо, если бы у меня был только такой метод: UpdateMyEnityt (сущность MyEntity), и этот метид обновит или добавит объект MyEntity.

Задача 2

Где я должен разместить сопоставления AutoMapper? До сих пор я поместил Updates на заводе и Get в контроллере. Я думал о размещении отображений в ModelViewObject, например ModelViewObject.ToDataModel, но если мне не нужен полный перевод (свойства som должны игнорироваться), то мне придется сделать этот AutoMapper где-нибудь еще.

Как вы справляетесь с этим?

Задача 3

Скажем, у вас есть рабочий метод обновления в нашем классе фабрики, где вы используете AutoMapper с игнорирующими сомами для преобразования ModelViewObject в ModelView (объект каркаса сущности). Скажем, теперь, когда мы обновляем таблицу базы данных новым полем / Property, если мы запускаем представление, которое обрабатывает ModelViewObject, отвечающий этой таблице, но не обрабатывают новое свойство, это будет означать, что свойство всегда будет установлено в значение null / string. пустой / 0. При запуске обычного метода обновления на заводе, это свойство не будет игнорироваться, и это означает, что нулевое значение заменит реальное значение.

Это большой риск, что такого рода обновления будут сделаны, и большой риск, что я не забуду обработать это в старом коде.

Как мне справиться с этим?

Задача 4 У utoMapper есть метод проверки, в котором вы можете проверить, возможно ли сопоставление, прямо сейчас у меня есть эти проверки, где сопоставление выполнено. Должен ли я поместить это в какой-то другой метод, где проверка будет выполняться так же быстро, как запускается приложение ? Остальные проблемы в отображениях будут отображаться первыми при использовании функции.

BestRegards

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Сначала вы должны использовать viewModel для каждого вида. И принеси только ту дату, которая тебе нужна. Вы должны добавить средство к ручному отображению для «трудной» проблемы. Я считаю, что AutoMapper - неправильный способ переноса даты из объекта Db в View Object.

1 голос
/ 16 декабря 2010

Проблема 1: Если вы используете другой View, используйте другой ViewModel.Таким образом, будут отображаться только отображаемые свойства.

Проблема 2: Различные настройки Automapper в каждом проекте с

Project1.AutomapperSettings.Execute();
Project2.AutomapperSettings.Execute();

и т. Д.

в Global.asax илипохожая точка входа.

Проблема 3: См. задачу 1

Проблема 4: Используйте атрибут ValidationAttribute для свойств viewmodel и позвольте mvc позаботиться об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...