Комплексные отображения DAL -> BL с использованием AutoMapper - PullRequest
1 голос
/ 11 октября 2010

Я планирую использовать AutoMapper в предстоящем проекте и пытаюсь найти возможные «узкие места».На данный момент наиболее сложный случай, который я могу себе представить, заключается в следующем: класс домена, который представлен 3 (например) таблицами в базе данных (мой уровень доступа к данным - LINQ to SQL).Чтобы создать экземпляр класса, мне нужно выполнить 3 запроса:

  1. Выбор по идентификатору из таблицы A (1 строка, напрямую идет к Class свойствам)
  2. Выбор по идентификаторуиз таблицы B (0..1 строки, переход к необязательному Class.Code свойству)
  3. Выбор по идентификатору из таблицы C (0..N строк, переход к Class.Parameters коллекции)

И я не уверен, как настроить отображение.Вот варианты, которые я рассмотрел:

  1. Выполните 3 запроса и отобразите Tuple<A,B,C> -> Class
  2. Объедините запросы 1 и 2, используя внешнее объединение (более эффективно).Но что мне делать с анонимным типом?
  3. Вставить datacontext в отображение, определить A -> Class mapping и позволить преобразователям типов выполнить свою работу?выглядит как победа.Что бы вы посоветовали?

    Редактировать: Ну, такие сложные случаи довольно редки (10-20%), и я могу сделать их вручную, а остальные 80-90% с AutoMapper просто отлично,Но я хотел бы знать, не предназначен ли AutoMapper для таких стратегий или я упускаю что-то важное.

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

На ваш вопрос сложно ответить, потому что, как и где объект домена получает свои данные, не является проблемой AutoMapper.Из документации AutoMapper :

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

Однако это не означает, что использование AutoMapper не должно влиять на процесс мышления, стоящий за объектами вашего домена.В качестве примера на ум приходит ленивая загрузка.Например, в вашем случае, если вы использовали отложенную загрузку для свойства Class.Parameters, но затем запускали это свойство через AutoMapper, данные всегда будут загружаться.Вот почему важно придерживаться правила одна модель для каждого вида .

Джимми Богард, один из создателей AutoMapper, обсуждает свое видение того, что такое AutoMapper в AutoMapper: объект-Объект картограф .Хотелось бы, чтобы я мог ссылаться прямо на него, но в комментарии к ответу на вышеупомянутую запись Богард заявляет:

Это то, что мы рассмотрели некоторое время (двусторонняя привязка), но в концемы обнаружили, что в обновлении слишком много бизнес-проверок.

Вместо этого мы сформировали другие шаблоны для обновления модели из сообщения / формы.Для получения дополнительной информации см. Исходный код Code Camp Server.

Как указано, вы можете найти интенсивное использование AutoMapper в источнике для CodeCampServer .Упрощенную версию кода CodeCampServer можно найти в исходном коде , поставляемом с ASP.NET MVC 2 в действии .

1 голос
/ 23 октября 2010

Это должно быть объективное решение, если смотреть на вашу объектную модель.

Плюсы:

  • Automapper хорош, если класс напрямую сопоставляется с сущностями, а имена свойств класса совпадают с table.columnname.
  • Automapper легко отображает коллекции.
  • Вы можете создать профиль Automapper и проверить свою конфигурацию.
  • У вас может быть один форматер для даты, времени и т. Д. На уровне приложения.
  • У вас есть возможность заполнить NULL пустым или любым другим символом.
  • Ignore () пригодится во многих ситуациях.

Минусы:

  • Исключения в отображении трудно отладить время от времени.
  • Ваш код выглядит загроможденным, если имеется много распознавателей.
  • В сложной структуре объектов вы можете разрешить прямое сопоставление для нескольких классов. Следовательно, не будет последовательности.
...