【问题标题】:How to minimize code in viewmodel to object conversion?如何最小化视图模型中的代码到对象的转换?
【发布时间】:2015-05-23 17:55:30
【问题描述】:

我的上下文中有一个对象:

abstract public partial class MyAbstractObject
{
    public int Id{set;get;}
    public string Name{set;get;}
}

public partial class MyChildObject: MyAbstractObject
{
    public string Details {set;get;} 
}

我有一个对象的视图模型:

public class MyAbstractViewModel
{
    public int Id{set;get;}
    public string Name{set;get;}
}

public class MyChildViewModel: MyAbstractViewModel
{
    public string Details {set;get;} 
}

现在为了将我的视图模型转换为对象,我使用类似的东西:

public MyChildObject MakeChildObject(MyChildViewModel vm)
{
  var child = new  MyChildObject();
  child.Id = vm.Id;
  child.Name = vm.Name;
  child.Details= vm.Details;

  return child;
 }

MyAbstractObject 属性中的问题。如果我有几个子对象,我会为每个子对象创建一个 MakeChildObject 方法。所有这些方法对于MyAbstractObject 属性都有相同的代码行:

  child.Id = vm.Id;
  child.Name = vm.Name;

如何最小化我的代码?

【问题讨论】:

    标签: c#


    【解决方案1】:

    看看 automapper http://automapper.org/

    它会自动映射类似的命名属性。它还包括映射基础对象的功能。 也可以看看 This post

    【讨论】:

      【解决方案2】:

      考虑是否可以在您的情况下使用 AutoMapper。它将根据属性名称自动映射不同类型的对象。它可能会节省您自己编写所有映射代码的时间。

      https://github.com/AutoMapper/AutoMapper

      然后您将像这样引导映射器:

      Mapper.CreateMap<MyChildViewModel, MyChildObject>();
      

      您将使用以下方法而不是您的方法 MakeChildObject

      MyChildObject vmMapped = Mapper.Map<MyChildViewModel>(vm);
      

      【讨论】:

      • 这听起来很符合所描述的问题。
      • 我不想使用任何库。只是想了解人们如何解决这个问题。
      • @KliverMax 当有足够多的人解决了同一个问题时,某个地方的某个人将开发一个解决问题的库。然后人们将停止尝试解决相同的问题并使用经过良好测试且健壮的库。 AutoMapper 是开源的。你可以看看它是如何递归映射对象的。
      【解决方案3】:

      尝试以下代码示例来解决您的问题。

      public class MyAbstractViewModel
      {
          public int Id{set;get;}
          public string Name{set;get;}
      
        public void MakeChildObject(MyAbstractViewModel vm, MyAbstractObject child)
        {
          child.Id = vm.Id;
          child.Name = vm.Name;
        }
      }
      
      public class MyChildViewModel: MyAbstractViewModel
      {
        public string Details {set;get;} 
      
        public MyChildObject MakeChildObject(MyChildViewModel vm)
        {
          var child = new  MyChildObject();
          this.MakeChildObject(this, child);
      
          child.Details= vm.Details;
      
          return child;
        }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2013-03-25
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2011-03-22
      • 2017-07-06
      相关资源
      最近更新 更多