Я хочу задать несколько вопросов о передовых практиках, касающихся отображения типов и использования методов расширения в C #. Я знаю, что эта тема обсуждалась несколько раз за последние несколько лет, но я прочитал много постов и все еще сомневаюсь.
Проблема, с которой я столкнулся, заключалась в расширении принадлежащего мне класса с помощью функции «convert». Допустим, у меня есть класс «Person», который представляет объект, который будет использоваться некоторой логикой. У меня также есть класс «Клиент», который представляет ответ от внешнего API (на самом деле будет более одного API, поэтому мне нужно сопоставить ответ каждого API с общим типом: Person). У меня есть доступ к исходному коду обоих классов, и теоретически я могу реализовать свои собственные методы там. Мне нужно преобразовать Customer в Person, чтобы я мог сохранить его в базе данных. Проект не использует автоматических картографов.
Я имею в виду 4 возможных решения:
Метод .ToPerson () в классе Consumer. Это просто, но мне кажется, что я нарушаю шаблон Single Responsibility, особенно в том, что класс Consumer сопоставлен с другими классами (некоторые требуются другим внешним API), поэтому он должен содержать несколько методов отображения.
Конструктор отображения в классе Person, принимающий Consumer в качестве аргумента. Также легко, и кажется, что вы нарушаете шаблон Single Responsibility. Мне нужно иметь несколько конструкторов отображения (так как будет класс из другого API, предоставляющий те же данные, что и Consumer, но в немного другом формате)
Класс преобразователей с методами расширения. Таким образом, я могу написать метод .ToPerson () для класса Consumer, и когда другой API-интерфейс представлен с собственным классом NewConsumer, я могу просто написать другой метод расширения и сохранить его в одном файле. Я слышал мнение, что методы расширения в целом являются злыми и должны использоваться только в случае крайней необходимости, так что это сдерживает меня. В противном случае мне нравится это решение
Конвертер / картографический класс. Я создаю отдельный класс, который будет обрабатывать преобразования и реализовывать методы, которые будут принимать экземпляр класса источника в качестве аргумента и возвращать экземпляр класса назначения.
Подводя итог, моя проблема может быть сведена к количеству вопросов (все в контексте с тем, что я описал выше):
Считается ли помещение метода преобразования внутри (POCO?) Объекта (например, метода .ToPerson () в классе Consumer) нарушением единого шаблона ответственности?
Считается ли использование конвертирующих конструкторов в классе (DTO-подобном) нарушением единого шаблона ответственности? Особенно, если такой класс может быть преобразован из нескольких типов источников, поэтому потребуется несколько конструкторов преобразования?
Считается ли использование методов расширения при доступе к исходному коду исходного кода плохой практикой? Может ли такое поведение использоваться в качестве жизнеспособного шаблона для разделения логики или это анти-шаблон?
Person
класс DTO? это содержит какое-либо поведение?