SOLID并映射DTO集合

时间:2015-07-05 05:02:53

标签: c# mapping solid-principles

我想实现从DTO到C#中的模型的映射。场景:

  • 我有一个List<DTO>,需要将其映射到List<ViewModel>
  • 输入列表包含从DTO派生的各种类的实例,例如UserProduct
  • 我的结果我需要不同的模型实例,具体取决于DTO,例如UserModelProductModel(全部来自ViewModel

我的约束是:

  • 我不能使用mappers(Automapper,ValueInjecter,...)
  • DTO放在自己的库中,不知道视图模型(但视图模型知道DTO)
  • 我希望尽可能接近SOLID(我想避免基于对象类型的switch / if语句)

现在我正在寻找一种实现整个事情的好方法。到目前为止我提出的是创建一个包含Dictionary<Type, Type>的辅助类,以便根据DTO的类型(使用Activator)查找要实例化的视图模型,然后实现ViewModel.Map(DTO dto)基本视图模型,然后在所有视图模型类中覆盖它。此Map方法需要将DTO转换为正确的类型(例如,User时为UserModel.Map()。还有其他建议吗?我能以某种方式避免施法吗?

修改

示例代码:https://github.com/andy250/Sandbox(项目SmartMap)

3 个答案:

答案 0 :(得分:0)

您可以使用包含Dictionary<Type,Type> map对象的类来更好地映射DTO类和相应的Model对象,以便map.get(DTO.class)为您提供对象本身。像

Dictionary<class,Model> map; map.put(User.class, new UserModel());

否则,您可以使用类名进行类型映射,并使用反射在ObjectFactory类内创建对象。

你也可以实现原型模式,因此相应的类有一个静态方法来返回它自己的对象,但是已知单例和原型模式可以用来创建抽象

答案 1 :(得分:0)

我已经审核了您的解决方案,并花了一些时间来根据您的要求玩各种选项。这就是我为了做你想要的东西而需要用一些Castle Windsor集成复制Automapper功能的方法。示例讨论如何集成here

这是我建议使用它。

答案 2 :(得分:0)

您可以根据接口

为每个DTO / ViewModel对设置自己的映射器
interface Mapper<TSource,TTarget> {
   TTarget ConvertToTarget(TSource source);
   TSource ConvertFromTarget(TTarget target);
}