转换/映射模型

时间:2012-11-02 09:57:00

标签: c# .net oop design-patterns automapper

我有一个通用模型,用于使用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语言吗?任何反馈/意见将非常感激。

非常感谢。

基督教

2 个答案:

答案 0 :(得分: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;}
 }

<强>映射

域名 - &gt;持久性

storage.Weight = weight.InMiligrams;

持久性 - &gt;域

weight = new Weight(storage.Weight);

持久层和域层知道内部所有权重都以miligrams(或您想要的任何其他度量单位)表示。

答案 1 :(得分:1)

从OO的角度来看,有些概念没有明确的模型可能有助于这种情况。在这种情况下,您使用数字表示和绝对数量及其度量单位(您不能将任何责任委托给它,因为它不是对象)并在模型对象中吸收转换责任。在我看来,你应该创建一个代表这种情况的更丰富的模型:

  • Class 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