2012-11-23 106 views
0

我們最近引入了一個全新的數據模型,它與邏輯結構的角度不同於我們當前的模型。我們還將模型的語言從德語改爲英語,因爲我們希望將模型結構作爲XML打開給我們的客戶。模型轉換覆蓋率

爲了能夠轉換模型,我們實現了一個顯式轉換,它將新模型中不同類的所有屬性基本匹配到舊模型中。

像這樣:

private OldModel Convert(NewModel src) 
{ 
    var dst = new OldModel(); 
    dst.Prop1 = src.SomeOtherProp 
    dst.Prop2 = Convert(src.ComplexProp); 
    //.... 
    return dst; 
} 

現在,我們要確保,所有的新模型的屬性被寫入舊模式的覆蓋範圍和測試目的。我們也希望確保我們不會遺忘任何財產,並且保證對於未來的模型擴展,我們不會忘記財產。

我的想法是解析代碼文件,提取從新模型讀取的所有屬性,使用反射在新模型上運行,並將其與其中的實際屬性進行比較。

這個解決方案感覺不像一個好的:-)有什麼建議嗎?

我感謝任何幫助!

+3

如果你用反射做了它,你必須添加一些映射信息(大概是通過屬性),所以你知道要比較哪些東西('Prop1'和'SomeOtherProp'等)。就個人而言,我認爲我只是在單元測試中使用常規代碼,除非我將這些屬性用於實際轉換本身。 –

+1

這聽起來像是你在編寫轉換時應該做的單元測試(使用適當的TDD:一步一步,屬性屬性),而不是在你寫完之後。 – Nailuj

+0

@MarcGravell現在我只想確保,所有屬性都可以使用/從新模型中讀取 – derape

回答

0

我們終於決定解析與正則表達式的CodeFile是這樣的:

@"private static [a-zA-Z0-9.]+[ ]+Convert[(][^)]*[)]\s*[{](?<body>[^{}]*(((?<Open>[{])[^{}]*)+((?<Close-Open>[}])[^{}]*)+)*(?(Open)(?!)))[}]"; 

它將匹配這樣private static Namespace.ClassName Convert(Namespace.ClassName input)方法和將提取的方法體。由於轉換器方法遵循簡單的結構模式,因此很容易提取我需要的信息。

0

我建議使用像AutoMapper這樣的映射庫。他們允許配置映射,轉換器並與公共屬性和特定的methods一起運行。

+0

儘管我喜歡該工具,但由於受到限制,我們無法在公司內部使用它... – derape