2010-10-10 2 views
1

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

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

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

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

Никто не выглядит как победа. Что ты предлагаешь?

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

+0

Можно ли использовать представление базы данных для выполнения шагов 1-3? Тогда у вас может быть просто сопоставление 1: 1 между объектом вида и вашим классом. – PatrickSteele

+0

Спасибо за ваш интерес! Технически я могу создать представление, которое выполняет внешнее соединение между 1 и 2, а затем полное соединение с 3, но такая денормализация определенно не то, что я хочу (увеличенный сетевой трафик с db плюс более сложная логика карты для обработки нулей, не так ли?) , – UserControl

ответ

2

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

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

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

Джимми Богард один из создателей AutoMapper обсуждает свое видение того, что AutoMapper находится в AutoMapper: the Object-Object Mapper.Я хотел бы связывать с ней напрямую, но в комментариях ответ на вышеупомянутый пост Богард гласит:

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

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

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

+0

Итак, это своего рода «сгиб» против «разворачиваемых» сценариев, где AutoMapper предназначен для поддержки «сворачивания» только? Мне определенно нужно пересмотреть, как я пытаюсь его использовать. – UserControl

+0

@UserControl Я обновил свой ответ, чтобы обсудить два способа «складывания». – ahsteele

1

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

Плюсы:

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

Минусы:

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