我有一个通用模型,用于使用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语言吗?任何反馈/意见将非常感激。
非常感谢。
基督教
答案 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的角度来看,有些概念没有明确的模型可能有助于这种情况。在这种情况下,您使用数字表示和绝对数量及其度量单位(您不能将任何责任委托给它,因为它不是对象)并在模型对象中吸收转换责任。在我看来,你应该创建一个代表这种情况的更丰富的模型:
我不熟悉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