代码之家  ›  专栏  ›  技术社区  ›  Alan Jackson

类转换方法去了哪里

  •  3
  • Alan Jackson  · 技术社区  · 14 年前

    我的许多类最终都需要转换函数。

    • 数据行->对象转换器
    • 视图模型<-&燃气轮机;模型转换器

    选项1:在源类内部

    public class Employee
    {
      public EmployeeViewModel ToViewModel() {}
    }
    
    var vm = myEmployee.ToViewModel()
    

    public class EmployeeViewModel
    {
      public static EmployeeViewMOdel FromModel() {}
    }
    
    var vm = EmployeeViewModel.FromModel(myEmployee);
    

    选项3:转换器内部

    public class EmployeeModelViewModelConverter
    {
      public static EmployeeViewModel ConvertToViewModel(Employee) {}
    }
    var vm = new EmployeeModelViewModelConverter.ConvertToViewModel(myEmployee);
    

    选项3似乎是最干净的 代价是大量的转换器类,或者大量的静态函数,或者大量的初始化/IOC注入。它还有最难看的语法,或者您必须使用扩展添加另一个类。

    澄清: 我说的不仅仅是ViewModel/Model类,而是需要将一个类转换为另一个类的任何东西。作为另一个例子,我有一个渲染系统,其中的对象通常需要转换为可渲染的基本体。

    4 回复  |  直到 14 年前
        1
  •  3
  •   John MacIntyre    14 年前

    我相信 Single Responsibility Principle 建议使用#3,它自己的转换器类。

        2
  •  1
  •   kyoryu    14 年前

    我可能会说第二种选择。由于拥有ViewModel的全部目的是在基础模型和视图需求之间提供一个逻辑“转换层”,因此它在很大程度上似乎是ViewModel的一个属性。

    选项1(在我看来)是错误的,因为它打破了模型和ViewModel之间的分离(考虑-理论上有多个ViewModel可能需要查看员工数据,它们可能都不同)。

    选择3也是合理的,当然会给你更多的分离。不过,我不完全确定这是否必要,因为ViewModel仍可能有一名员工。

        3
  •  1
  •   CubanX    14 年前

    AutoMapper . 尽管它最初是为DTO和ViewModel对象之间的映射而开发的,但是它非常强大,可以删除所有映射代码,而不需要额外的类。

        4
  •  0
  •   mikemanne    14 年前

    这可能是一种“个人偏好”的情况。您的每个选项都是在.NET库中实现的,因此我们可以猜测,从Microsoft的角度来看,没有一个明确的最佳实践:

    • someCollection.ToArray()
    • DateTime.Parse()
    • Convert.ToInt32()