Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换/映射模型_C#_.net_Oop_Design Patterns_Automapper - Fatal编程技术网

C# 转换/映射模型

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

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

非常感谢

克里斯汀

我就是这样做的

领域

坚持

映射

域->持久性

持久性->域


持久性层和域层知道,在内部,所有权重都以毫克或您想要的任何其他度量单位表示

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

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