C #에서 매핑 유형 및 확장 메서드 사용과 관련된 모범 사례에 대해 몇 가지 질문을하고 싶습니다. 이 주제에 대해 지난 몇 년 동안 여러 차례 논의되었지만, 많은 게시물을 읽었지만 여전히 의문이 있습니다.
내가 겪은 문제는 내가 소유 한 클래스를 "변환"기능으로 확장하는 것이 었습니다. 논리에 의해 사용될 객체를 나타내는 "Person"클래스가 있다고 가정 해 봅시다. 또한 외부 API의 응답을 나타내는 "고객"클래스가 있습니다 (실제로 둘 이상의 API가 있으므로 각 API의 응답을 공통 유형 : Person에 맵핑해야 함). 나는 클래스의 소스 코드에 액세스 할 수 있고 이론적으로 거기에 내 자신의 메소드를 구현할 수 있습니다. 고객을 Person으로 변환해야 데이터베이스에 저장할 수 있습니다. 이 프로젝트는 자동 매퍼를 사용하지 않습니다.
가능한 4 가지 해결책이 있습니다.
Consumer 클래스의 .ToPerson () 메서드 간단하지만, Single Responsibility 패턴을 깨뜨리는 것처럼 보입니다. 특히 Consumer 클래스가 다른 클래스 (다른 외부 API에 필요함)에도 매핑되므로 여러 매핑 방법이 포함되어야합니다.
Consumer를 인수로 사용하는 Person 클래스의 맵핑 생성자 또한 단일 책임 패턴을 위반하는 것처럼 쉽고 쉽습니다. 소비자와 동일한 데이터를 제공하지만 약간 다른 형식으로 다른 API의 클래스가 있으므로 여러 개의 매핑 생성자가 필요합니다.
확장 메소드가있는 변환기 클래스 이렇게하면 Consumer 클래스에 .ToPerson () 메서드를 작성할 수 있으며 다른 API가 자체 NewConsumer 클래스와 함께 도입되면 다른 확장 메서드를 작성하여 모두 동일한 파일에 유지할 수 있습니다. 확장 방법은 일반적으로 악의적이며 절대적으로 필요한 경우에만 사용해야하므로 의견이 나쁘다는 의견을 들었습니다. 그렇지 않으면이 솔루션을 좋아합니다
변환기 / 매퍼 클래스. 변환을 처리하고 소스 클래스 인스턴스를 인수로 사용하고 대상 클래스 인스턴스를 반환하는 메서드를 구현하는 별도의 클래스를 만듭니다.
요약하면, 내 문제는 질문의 수로 축소 될 수 있습니다 (위의 설명과 관련하여 모두).
컨슈머 클래스의 .ToPerson () 메소드와 같은 (POCO?) 오브젝트에 변환 메소드를 넣는 것이 단일 책임 패턴을 위반하는 것으로 간주됩니까?
(DTO와 같은) 클래스에서 변환 생성자를 사용하는 것이 단일 책임 패턴을 깨는 것으로 간주됩니까? 특히 그러한 클래스가 여러 소스 유형에서 변환 될 수 있다면 여러 변환 생성자가 필요합니까?
원래 클래스 소스 코드에 액세스하는 동안 확장 메소드를 사용하는 것이 나쁜 습관으로 간주됩니까? 이러한 동작을 논리 분리를위한 실행 가능한 패턴으로 사용할 수 있습니까? 아니면 안티 패턴입니까?
Person
A 급 DTO는? 동작이 포함되어 있습니까?