Automapper - це "об'єкт-об'єктний картограф" для .Net, що означає копіювання об'єктів з класу в інший клас, який представляє те саме.
Чому це завжди корисно? Чи дублювання класів завжди корисне / хороший дизайн?
Automapper - це "об'єкт-об'єктний картограф" для .Net, що означає копіювання об'єктів з класу в інший клас, який представляє те саме.
Чому це завжди корисно? Чи дублювання класів завжди корисне / хороший дизайн?
Відповіді:
Швидкий пошук Google виявив такий приклад:
http://www.codeproject.com/Articles/61629/AutoMapper
показуючи ідеально правильне використання AutoMapper, що, безумовно, не є прикладом для поганого дизайну. У шаруватій програмі у вас можуть бути об'єкти у вашому шарі даних або бізнес, і вам іноді потрібна лише підмножина атрибутів цих об’єктів даних або певний вид на них у вашому шарі інтерфейсу користувача. Таким чином, ви створюєте модель представлення, яка містить об'єкти з точно атрибутами, які вам потрібні у вашому інтерфейсі, а не більше, і використовуєте AutoMapper для надання вмісту цих об'єктів з меншим кодом котла.
У такій ситуації ваші "об'єкти перегляду" не є дублікатом оригінального класу. Вони мають різні методи і, можливо, кілька повторюваних атрибутів. Але це нормально, якщо ви використовуєте ці об'єкти перегляду лише для відображення інтерфейсу користувача та не почнете використовувати їх для маніпулювання даними або для ділових операцій.
Ще одна тема, яку ви можете прочитати, щоб краще зрозуміти це, - це схема розбиття відповідальності за запити Fowlers на відміну від CRUD. Він показує вам ситуації, коли різні об'єктні моделі для запиту даних та оновлення їх у базі даних мають сенс. Тут відображення від однієї об'єктної моделі до іншої також може бути здійснено за допомогою інструменту типу AutoMapper.
Чи дублювання класів завжди корисне / хороший дизайн?
Його найкраща практика мати окремий клас моделі перегляду для використання в шарі інтерфейсу, а не використовувати той самий клас, який використовується в рівні даних. У вашому інтерфейсі / веб-сторінці може знадобитися відображення інших бітів інформації, які не суворо пов'язані з сукупністю даних. Створюючи цей додатковий клас, ви даєте собі свободу легко налаштувати інтерфейс користувача, оскільки вимоги з часом змінюються.
Що стосується використання AutoMapper, я особисто уникаю цього з 3 причин:
Мовчазні збої частіше зустрічаються
Оскільки AutoMapper автоматично відображає між властивостями, зміна назви властивості для одного класу, а не іншого, призведе до того, що відображення властивостей буде пропущено. Компілятор не знатиме. Automapper не хвилює.
Відсутність статичного аналізу
Тож вам дали велику базу коду для вирішення. Є мільйон класів з мільйоном властивостей. Багато виглядають, як вони не використовуються, або є дублікатами. Цей інструмент «Знайти всі посилання» у Visual Studio допоможе вам побачити, де використовуються властивості, і допоможе побудувати карту в голові про те, як уся програма зависає. Але зачекайте, явних посилань на половину властивостей немає, оскільки використовується Automapper. Моя робота зараз пекло набагато важче.
Пізні вимоги, що збільшують складність
У Automapper все гаразд і денді, коли все, що ви хочете зробити, - це скопіювати значення з класу ONE в інший (як це часто буває на START розвитку), але пам’ятаєте ті вимоги, які змінюються з часом? Що робити, якщо вам зараз потрібно отримати значення з інших частин вашої програми, можливо, специфічних для користувача, який увійшов у систему, або якогось іншого контекстуального стану?
Схема створення AutoMapper створення індивідуальних відображень класу під час запуску програми не піддається таким видам змін, що стосуються конкретного контексту. Так, напевно, є способи змусити його працювати, але я зазвичай вважаю більш чистим, простішим та виразним, щоб писати логіку сам.
Підводячи підсумок, перш ніж звернутися до Automapper, щоб заощадити 30 секунд вручну зіставлення одного класу в інший, подумайте про це.
Програмування - це мистецтво розповісти іншій людині, що хоче робити комп’ютер. - Дональд Кнут
Зважаючи на це, запитайте себе: "Чи корисний AutoMapper сьогодні і чи буде він завтра?"
З мого досвіду, коли хтось скаржився на "занадто багато котла" і хоче використовувати AutoMapper, це було одним із наступних дій:
Однак:
Якщо ви вибрали статичну мову, скористайтеся цією мовою. Якщо ви намагаєтеся обійти елементи управління мовою, які допомагають запобігти помилкам через надмірне використання API відображення та магії, як-от AutoMapper, це просто означає, що ви вибрали мову, незадовільну для ваших потреб.
Крім того, тільки те, що Microsoft додав функції до C #, не означає, що вони є чесною грою у будь-якій ситуації або що вони підтримують кращі практики. Наприклад, відображення та "динамічне" ключове слово слід застосовувати у випадках, коли без них просто неможливо виконати те, що потрібно. AutoMapper не є рішенням для будь-якого випадку використання, який вже не може бути вирішений без нього.
Отже, чи є дублювання класів поганим дизайном? Не обов'язково.
Чи AutoMapper погана ідея? Так, абсолютно.
Використання AutoMapper вказує на системні недоліки в проекті. Якщо ви виявите, що вам це потрібно, зупиніться і подумайте над своїм дизайном. Ви завжди знайдете вдосконалений, більш читабельний, більш ремонтований та без помилок дизайн.
Існує більш глибока проблема: справа в тому , що C # і Ja наполягають більшість / всі типи повинні бути помітні на ім'я , а не структури: наприклад , class MyPoint2D
і class YourPoint2D
окремі види , навіть якщо вони мають точно таке ж визначення. Коли потрібний тип - «якась анонімна річ із x
полем і y
полем» (тобто запис ), вам не пощастило. Отже, коли ви хочете перетворити YourPoint2D
на "a" MyPoint2D
, у вас є три варіанти:
this.x = that.x; this.y = that.y
Вибір 1 досить легкий у малих дозах, але швидко стає справжньою справою, коли кількість типів, які потрібно зіставити, велике.
Вибір 2 є менш ніж бажаним, оскільки тепер вам потрібно додати додатковий крок до процесу збирання, щоб створити код, і переконатися, що вся команда отримає нагадування. У гіршому випадку вам також доведеться закатати власний генератор коду чи систему шаблонів.
Це залишає у вас роздуми. Ви можете зробити це самостійно, або ви можете використовувати AutoMapper.
Automapper - одна з тих бібліотек / інструментів, де імператор буквально бігає по задній голі. Коли ви проходите повз блискучого логотипу, ви розумієте, що він не робить нічого, чого ви не можете зробити вручну з набагато кращими результатами.
Хоча я не зовсім впевнений, як це натякає на членів автоматичного картографування, це, швидше за все, передбачає додаткову логіку виконання та можливе відображення. Це може бути значною ефективністю покарання в обмін на економію часу. З іншого боку, підказки вручну виконуються задовго до моменту компіляції.
У випадках, коли AutoMapper не має поняття, потрібно налаштувати відображення за допомогою коду та встановлення прапорів. Якщо ви збираєтеся заважати виконувати всі налаштування та роботи з кодом, вам доведеться сумніватися, скільки це економить на ручному картографуванні.