2012-11-02 92 views
0

我有一個通用模型,用於存儲使用ORM技術的所有數據。這種模式必須偶爾轉化爲另一種模式來「做某件事」。目前我使用這個(簡體)的方法,把通用模型店體重公斤和對象模型並將其存儲在磅:轉換/映射模型

public class GenericModelClassA 
{ 
    public virtual double Weight { get; set; } 
} 

public interface IModelX 
{ 
    double Weight { get; set; } 
} 

public class ModelXClassA : GenericModelClassA, IModelX 
{ 
    private const double WeightConversionFactor = 2.20462; 

    public override double Weight 
    { 
     set 
     { 
     base.Weight = value/WeightConversionFactor; 
     } 
     get 
     { 
     return base.Weight * WeightConversionFactor; 
     } 
    } 
} 

這是一個體面的解決問題的方法?我聽說過模型驅動轉換(MDT)語言來查詢/查看/轉換/運營(QVTO)。我的方法太天真了嗎?你會推薦MDT語言嗎?任何反饋/意見將非常感激。

非常感謝。

Christian

+0

什麼是真正的問題? –

+0

不知道你是否讀了所有的東西,或者如果我不夠清楚... – cs0815

+0

我個人不會在這裏使用繼承,而是將基礎模型作爲私有屬性。如果僅僅是因爲它意味着消耗ModelXClassA的代碼不需要知道GenericModelClassA。 –

回答

1

從OO的角度來看,有一些概念不是明確的模型,可能有助於這種情況。在這種情況下,你是代表和絕對數量和它的計量單位與一個數字(你不能委託任何責任,因爲它不是一個對象),並吸收你的模型對象的轉換責任。在我看來,你應該創建一個更豐富的模型來代表這種情況:

  • 類WeightUnit,帶有Kilo和Pound的子類。
  • 類別重量,具有絕對數量和重量單位。換句話說,「權重」是一個數值加上賦予該數值意義的權重單位。
  • 你的模型類有一個權重變量。

我不熟悉C#所以請容忍我在這裏:

abstract public class WeightUnit 
{ 
    abstract public function convertValueToKilo(float value); 
    abstract public function convertValueToPounds(float value); 
} 

public class Kilo extends WeightUnit 
{ 
    public function convertValueToKilo(float value) {return value;} 
    public function convertValueToPounds(float value) {return value * 2.20462262;} 
} 

public class Pounds extends WeightUnit 
{ 
    public function convertValueToKilo(float value) {return value/2.20462262;} 
    public function convertValueToPounds(float value) {return value;} 
} 

public class Weight 
{ 
    protected WeightUnit unit; 
    protected float value; 

    public function Weight(float value, WeightUnit unit) 
    { 
     //set the internal state 
    } 

    public function toKilo() 
    { 
     return new Weight(this.unit.convertValueToKilo(this.value), new Kilo()); 
    } 

    public function toPounds() 
    { 
     return new Weight(this.unit.convertValueToPounds(this.value), new Pounds()); 
    } 
} 

一個與此實施的問題是轉換量爆炸隨着越來越多的衡量單位你。對於這些情況,您通常會選擇一個「默認」單位(例如Kilo),而所有其他單位都知道如何轉換爲千克數。在這種情況下,添加一個新單元意味着添加一個類和兩個方法。但是,進行這種雙重轉換可能會導致一些輪迴錯誤。

HTH

+0

我喜歡把'變壓器'注入重量的事實。 – cs0815

+0

謝謝。我認爲這是一個責任分配問題:誰應該知道如何轉換到另一個單位?單位本身。有測量框架(我不知道特別是一個用於C#)的模型的東西,如重量單位,距離單位,時間單位等,以及它們之間的轉換。 –

+0

是否有任何理由使用抽象類而不是WeightUnit的接口?定義一個像WeightUnit這樣的變壓器接口並且只實現一個可以注入Weight的混凝土變壓器類會更好嗎?我個人覺得有點矯枉過正。我的一些課程最多有50個屬性(即權重)。 – cs0815

1

這就是我該怎麼做的。

public class Weight 
{ 
    public Weight(decimal miligrams) { InMiligrams= miligrams;} 

    public decimal InMiligrams {get;private set;} 

    public decimal InGrams { get { return InMiligrams*1000; }} 

    /* other conversions as properties */ 
} 

持久

public class StorageModel 
{ 
    public virtual decimal Weight {get;set;} 
} 

映射

域 - >持久性

storage.Weight = weight.InMiligrams; 

持久性 - >域

weight = new Weight(storage.Weight); 

持久層和領域層知道,在內部的所有重量都在miligrams表達(或任何你想要的其他測量單元)。

+0

我很抱歉,但我認爲你仍然誤解了這個問題。我有一個已經存在的通用模型。這個模型必須轉換成不同的模型。我想這有點像將領域模型轉換成不同的視圖模型。這實際上讓我想起了automapper ... – cs0815