2017-12-14 8 views
-1
public static class PersonPropertyMapper 
{ 
    public static PeopleSearchBusinessLogic.DomainModels.Person ToDomainModel(this Entities.Person entity) 
    { 
     return new PeopleSearchBusinessLogic.DomainModels.Person() 
     { 
      Id = entity.Id, 
      Name = entity.Name, 
      Address = entity.Address, 
      Age = entity.Age, 
      Interests = entity.Interests, 
      Picture = entity.Picture 
     }; 
    } 
} 

여기서 볼 수 있듯이 개체를 앞뒤로 변환하는 확장 메서드가있는 클래스가 있습니다. 이 경우 ToDomainModel 메서드는 Entities.Person 개체의 확장입니다.C# 확장 메서드를 확인하는 방법 서명이 일치합니까?

확장 메서드가 포함 된 클래스는 다른 클래스에서 파생되거나 인터페이스를 구현할 수 없다는 것을 알고 있습니다. 그러나 더 많은 "PropertyMappers"를 추가 할 때 이러한 클래스가 모두 동일한 인터페이스를 따라야하므로 메서드 이름이 응용 프로그램 전체에서 동일해야합니다. 이것에 대한 간단한 해결책이있는 것처럼 느껴지지만,이 문제를 처음 접한 것은 아닙니다.

예를 들어 Car 객체가 있고 CarPropertyMapper를 만들어야한다고 가정 해 보겠습니다. 지금은 표준 "ToDomainModel"대신 "ToCarDomainModel()"으로 확장 메서드의 이름을 지정하는 것을 막을 수있는 방법이 없습니다.

나는이 딜레마를 해결하기위한 해결책을 원하고, 적어도 내가 잘못된 방향으로 가고있는 이유를 이해해야한다.

또는 간과 한 개체 (도메인 모델 및 엔터티 등) 매핑 솔루션이 있습니까?

+1

확장 방법이 적용되는 방법이 아닙니다. 모든 메소드가 같은 이름을 가지기를 원하면 인터페이스를 만들고 모든 클래스가 그 메소드의 클래스를 상속 받도록하십시오. 확장 메서드는 기본 클래스를 변경할 수 없지만 기본 클래스를 메서드를 추가하려는 경우 주로 사용됩니다. – Lauraducky

+0

@Lauraducky 오, 고마워요! 이 작업을 수행하는 더 좋은 방법은 도메인 모델이 엔티티에 대해 알지 못하므로 모든 변환 메소드 서명이있는 Entities.Person 클래스 (IMapper라고 함)에 대한 인터페이스를 만드는 것입니다. Entity 클래스에서 변환 세부 사항을 구현해야합니다. 또는 아래에서 언급 한 AutoMapper를 사용할 수 있습니다. 나는 그 해결책이 내가 만들어내는 것처럼 복잡하지 않다고 생각했다. –

답변

1

확장 메서드는 정적 클래스의 정적 메서드이지만 물론 인터페이스를 구현하거나 다른 클래스를 확장 할 수 없습니다. 그러나 이것은 정상적인 사용은 아닙니다. 이것에

일부 솔루션 :

  • 그 정적 클래스
  • 가 있다는 사실에 동의
  • 정지 확장 방법을 사용하는 인터페이스 지향 설계
AutoMapper 같은 매핑 라이브러리를 사용하도록 설정