2014-03-04 3 views
4

확장 메서드로 내 발을 들여 놓고 현재 응용 프로그램 송장을 Quickbooks Invoice로 변환하는 매핑 논리를 개발 중입니다. .Convert() 확장 방법을 사용하는 것이 좋습니다.하나의 클래스를 다른 클래스에 매핑하는 확장 메서드를 사용하는 것이 적절합니까?

public static QBInvoice Convert(this InvoiceHeader importedInvoice) 

변환은 클래스 간의 필드 매핑 일뿐입니다. 그러나 확장 메소드가 원래 클래스를 확장하고 다른 클래스로 변환하지 않는다는 것을 어딘가에서 읽습니다. 그러므로 내가 왜 묻고 있느냐. 나는 기술적으로 그것을 할 수 있음을 알고 있지만 준수하거나 금기시하는 것이 가장 좋습니다.

+0

'InvoiceHeader'가 코드에 정의되어있는 경우 확장 메소드를 작성할 필요가 없습니다. 메소드를 클래스에 넣기 만하면됩니다. 그렇다고해서 뭔가를 변환하는 확장 메서드를 작성하는 데는 아무 문제가 없습니다. – Blorgbeard

+0

@Blorgbeard 그렇지만 우리 앱은 Quickbooks, Sage 등 여러 금융 애플리케이션과 통합됩니다. 따라서 모든 변환 논리가 각각의 Financials 어댑터에 있으므로 변환 메소드로 원래 InvoiceHeader 클래스를 어지럽히고 싶지 않았습니다. 계획. –

답변

2

우리는 ... 클래스에게 아마 최고의 솔루션을 모든 시간을지도하지만 적어도 당신이 어딘가에 멀리 지루한 불필요한 코드를 숨기고 좋은 읽을 수있는 중요한 코드 (비즈니스 로직)을 만들기 위해 그것을 사용할 수 있습니다.

클래스 간의 매핑은 클래스 자체 (SRP)와는 아무런 관련이 없으므로이 코드를 두 클래스 중 하나에 두는 것이 더 깨끗한 해결책입니다. 개인적으로

+0

감사합니다. @Zdrakvo. 왜 이것이 최상의 솔루션이되지 않을까요? –

+0

개체 사이에 매핑하는 가장 좋아하는 방법은 자동으로 수행 할 수있는 일종의 매퍼를 사용하는 것입니다. 몇몇 대중적인 그들, 아무도는 완벽하지 않다. 그러나 그들은 모두 최소한의 이름으로 같은 이름의 속성을 매핑 할 것이고 나머지를 매핑하는 방법을 컨피규레이션이나 컨벤션의 일부 형태로 허용 할 것입니다 ... 나는 휠체어를 재발 명할 것을 제안하지 않지만 당신 자신의 상황을 평가하고 자신 만의 것을 작성해보십시오. –

5

내가 명시 적으로 사용하려면 이렇게 캐스트 :

public class InvoiceHeader 
{ 
    public static explicit operator QBInvoice(InvoiceHeader invoice) 
    { 
     return new QBInvoice {}; // do your mapping 
    } 
} 

그런 다음 당신은 그냥 캐스팅 할 수

var qbInvoice = (QBInvoice) invoiceHeader; 
+0

그것은 나를위한 새로운 개념, 명시 적 캐스팅입니다. 네가 할 수 있다는 것을 나는 몰랐다. 감사. 나는 그것을 대안으로 볼 수 있습니다. –

+0

다음은 일부 읽기 http://msdn.microsoft.com/en-us/library/09479473.aspx 및 msdn.microsoft.com/en-us/library/85w54y0a.aspx – shenku

2

확장 메서드로 정의 클래스에 대한 좋은 잘 받아 변환 방법이다 ToArray(). AsEnumerable, ToListToDictionary은 잘 알려진 다른 "변환"확장 방법입니다.

"받는 사람"또는 그냥 "에"로, 다른 형식으로 변환 확장 메서드에 대한 허용 명명 규칙이 될 것 "으로"이벤트에 대한 표준 명명 규칙의 일부입니다.

+0

@Chad'Convert '를 개선 할 수 있습니다. 이 협약에 따라 그런 식으로 다른 반환 형식의 변환이 필요한 경우 혼합 된 규칙이나 하나의 부족으로 끝나지 않을 것입니다. –

관련 문제