Я хочу задати кілька питань щодо найкращих практик щодо типів відображення та використання методів розширення в C #. Я знаю, що ця тема обговорювалася неодноразово за останні кілька років, але я прочитав багато публікацій і все ще сумніваюся.
Проблема, з якою я зіткнулася, - це розширення класу, яким я володію, з функцією "конвертувати". Скажімо, у мене є клас "Person", який представляє об'єкт, який буде використовуватися певною логікою. У мене також є клас "Клієнт", який представляє відповідь із зовнішнього API (насправді буде більше одного API, тому мені потрібно зіставити відповіді кожного API на загальний тип: Person). Я маю доступ до вихідного коду обох класів і теоретично можу реалізувати там свої власні методи. Мені потрібно конвертувати Клієнта в Особу, щоб я міг зберегти його в базі даних. У проекті не використовуються автоматичні картографи.
Маю на увазі 4 можливих рішення:
Метод .ToPerson () у класі споживача. Це просто, але здається, що для мене порушується схема єдиної відповідальності, тим більше, що клас споживача також відображається в інших класах (деяких вимагає інший зовнішній API), тому він повинен містити кілька методів відображення.
Конструктор картографування у класі Person, що сприймає споживача як аргумент. Також легко, а також здається, що порушується схема єдиної відповідальності. Мені потрібно мати декілька конструкторів відображення (оскільки буде клас з іншого API, який надає ті самі дані, що і споживач, але у дещо іншому форматі)
Клас перетворювачів із методами розширення. Таким чином я можу написати .ToPerson () метод для споживчого класу, і коли інший API вводиться з його власним класом NewConsumer, я можу просто написати інший метод розширення і зберегти все в одному файлі. Я чув думку, що методи розширення загалом є злими, і їх слід застосовувати лише в разі крайньої необхідності, тому це мене стримує. Інакше мені подобається це рішення
Конвертор / клас Mapper. Я створюю окремий клас, який буде обробляти перетворення та реалізовувати методи, які будуть приймати екземпляр класу джерела як аргумент і повертати екземпляр класу призначення.
Підводячи підсумок, моя проблема може бути зведена до кількості питань (все в контексті того, що я описав вище):
Чи вважається розміщення методу перетворення всередині об'єкта (POCO?) (Наприклад, методу .ToPerson () у споживчому класі) порушенням однієї структури відповідальності?
Чи вважається використання конструкторів перетворення в (схожий на DTO) розрив єдиної моделі відповідальності? Особливо, якщо такий клас можна перетворити з декількох типів джерела, тож знадобиться кілька конструкторів, що перетворюють?
Чи вважається використання методів розширення під час доступу до вихідного вихідного коду класу поганою практикою? Чи може така поведінка використовуватись як життєздатний зразок для розділення логіки чи це антидіаграма?
Person
клас DTO? чи містить вона якусь поведінку?