2012-11-02 60 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