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;
        }
    }
}

这是解决问题的好方法吗?我听说过用于查询/查看/转换/操作 (QVTO) 的模型驱动转换 (MDT) 语言。我的做法是不是太天真了?你会推荐 MDT 语言吗?任何反馈/意见将不胜感激。

非常感谢。

基督教

4

2 回答 2

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());
    }
}

此实现的问题之一是转换量随着您拥有的重量单位的增加而爆炸式增长。对于这些情况,您通常选择一个“默认”单位(例如公斤),而所有其他单位都知道如何转换为公斤/从公斤转换。在这种情况下,添加一个新单元意味着添加一个类和两个方法。但是,执行这种双重转换可能会产生一些舍入错误。

高温高压

于 2012-11-02T12:04:52.103 回答
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);

Persistence 层和 Domain 层知道在内部所有权重都以毫克(或您想要的任何其他度量单位)表示。

于 2012-11-02T11:34:46.440 回答