C# 转换/映射模型
我有一个通用模型,用于使用ORM技术存储所有数据。为了“有所作为”,必须偶尔将此模型转换为另一个模型。目前,我正在使用这种简化方法,其中通用模型以千克为单位存储重量,目标模型以磅为单位存储重量:C# 转换/映射模型,c#,.net,oop,design-patterns,automapper,C#,.net,Oop,Design Patterns,Automapper,我有一个通用模型,用于使用ORM技术存储所有数据。为了“有所作为”,必须偶尔将此模型转换为另一个模型。目前,我正在使用这种简化方法,其中通用模型以千克为单位存储重量,目标模型以磅为单位存储重量: public class GenericModelClassA { public virtual double Weight { get; set; } } public interface IModelX { double Weight { get; set; } } publi
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语言吗?如有任何反馈/意见,将不胜感激
非常感谢
克里斯汀我就是这样做的
领域
坚持
映射
域->持久性
持久性->域
持久性层和域层知道,在内部,所有权重都以毫克或您想要的任何其他度量单位表示 从面向对象的角度来看,有些概念不是明确的模型,在这种情况下可能会有所帮助。在本例中,您使用一个数字来表示绝对量及其度量单位,您不能将任何责任委托给该数字,因为它不是一个对象,并且在您的模型对象中吸收了转换责任。在我看来,您应该创建一个更丰富的模型来代表这种情况: 类weighunit,子类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());
}
}
此实现的一个问题是,转换量随着拥有的重量单位的增加而爆炸。对于这些情况,您通常会选择默认单位,例如千克,而所有其他单位都知道如何转换成/转换成千克。在这种情况下,添加一个新单元意味着添加一个类和两个方法。但是,执行此双重转换可能会产生一些舍入错误
HTH不确定您是否阅读了所有内容,或者我是否不够清楚……就个人而言,我不会在这里使用继承,而是将基本模型作为私有属性。如果仅仅因为这意味着使用ModelXClassA的代码不需要知道GenericModelClassA,那么我可能会很愚蠢,但我不知道你想问什么……好的观点。因此,聚集而不是继承,以向ModelX的使用者隐藏GenericModel的属性?您是在谈论外观吗?我想你想要战略模式,我喜欢你把“变形金刚”注入体重。谢谢。我认为这是一个责任分配的问题:谁应该知道如何转换到另一个单位?单位本身。有一些度量框架,我不知道,特别是一个用于C的度量框架,它对权重单位、距离单位、时间单位等以及它们之间的转换进行建模。有什么理由使用抽象类而不是权重单位的接口吗?定义一个像WeightUnit这样的transformer接口并实现一个可以注入到Weight中的具体transformer类不是更好吗。我个人觉得这有点过分了。我的一些类最多有50个属性,即权重。当然,如果WeightUnit要做的唯一一件事就是定义一组抽象方法(如示例中所示),那么最好将其建模为接口。我不知道你的整个问题领域,所以我不能说出确切的责任。也许有一些行为可以在一个类中抽象出来,我不知道。关于第二个观察结果,我不同意。OOP是关于拥有丰富的模型并将行为委托给那些对象。如果可以简单,为什么要让它变得更复杂?一些人说,拥有100个对象而不是50个浮动是一个问题,或者说速度很慢。这就是OOP语言优化的目的。我已经制作了拥有数千个对象的系统,我不认为这是一种过分的杀伤力;相反,它们是非常有表现力和灵活性的模型。很抱歉,我认为你仍然误解了这个问题。我有一个已经持久化的通用模型。这个模型必须转换成不同的模型。我想这有点像将域模型转换为不同的视图模型。这让我想起了汽车制造商。。。
public class StorageModel
{
public virtual decimal Weight {get;set;}
}
storage.Weight = weight.InMiligrams;
weight = new Weight(storage.Weight);
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());
}
}