2014-03-04 50 views
4

剛開我的腳溼擴展方法和我目前正在開發一些映射邏輯到應用程序的發票轉換爲QuickBooks的發票。認爲使用.Convert()擴展方法可能是一個好主意。是否適合使用擴展方法將一個類映射到另一個

public static QBInvoice Convert(this InvoiceHeader importedInvoice) 

轉換隻是一個類到另一個類的字段映射。但後來我在某處讀到擴展方法是擴展原始類,而不是將其轉換爲另一個類。所以我爲什麼問。我知道我在技術上可以做到,但最佳做法是否符合或禁忌?

+0

如果在代碼中定義了'InvoiceHeader',則不需要編寫擴展方法。只要把這個方法放在課堂上。話雖如此,編寫轉換某些東西的擴展方法沒有任何問題。 – Blorgbeard

+0

@Blorgbeard它,但我們的應用程序與多個財務應用程序集成:QuickBooks的,鼠尾草等,所以我們不想弄亂我們原來InvoiceHeader類轉換方法爲所有的轉換邏輯將在他們各自財務適配器項目。 –

回答

2

我們用它來映射類所有的時間......可能不是最好的解決辦法,但至少你隱藏無聊不必要的代碼某個遙遠的地方,並做出重要的不錯,可讀的代碼(業務邏輯)。

我必須強烈上述Blogbeard的評論不以爲然:類之間的映射無關與類本身(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

爲類A偉大的廣爲接受的轉換方法,定義爲擴展方法是ToArray()AsEnumerableToListToDictionary是其他公認的「轉換」擴展方法。

「要」或「AS」似乎是爲擴展方法,其轉換爲另一種類型的可以接受的命名慣例,就像「開」是事件的標準命名約定的一部分。

+0

@Chad'Convert'可以改善上遵循這個慣例。這樣,如果你需要一個具有不同返回類型的轉換器,你將不會結束混合約定或缺少一個。 –

相關問題