SOLID和绘制DTO集合

本文关键字:集合 DTO 绘制 SOLID | 更新日期: 2023-09-27 18:01:08

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

  • 我有一个List<DTO>,需要将其映射到List<ViewModel>
  • 输入列表包含从DTO派生的各种类的实例,例如UserProduct
  • 因此,根据DTO,我需要不同的模型实例,例如UserModelProductModel(均源自ViewModel(

我的限制是:

  • 我无法使用映射程序(Automapper、ValueInjecter…(
  • DTO被放置在自己的库中,并且不知道视图模型(但视图模型知道DTO(
  • 我希望尽可能接近SOLID(我希望避免基于对象类型的switch/if语句(

现在我正在寻找一个很好的方法来实现整个事情。到目前为止,我所想到的是创建一个包含Dictionary<Type, Type>的助手类,这样我就可以根据DTO的类型(使用Activator(查找要实例化的视图模型,然后在基本视图模型中实现ViewModel.Map(DTO dto),然后在所有视图模型类中覆盖它。此Map方法将需要将DTO强制转换为适当的类型(例如,在UserModel.Map()的情况下为User(。还有其他建议吗?我能以某种方式避免选角吗?

编辑

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

SOLID和绘制DTO集合

您可以使用一个类来包含Dictionary<Type,Type> map的对象。更好的方法是映射DTO类和相应的Model对象,这样map.get(DTO.class)就为您提供了对象本身。像

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

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

您也可以实现原型模式,因此相应的类有一个静态方法来返回自己的对象,但singleton和prototype模式对于viopate抽象来说是已知的

我已经审查了您的解决方案,并花了一些时间根据您的要求来考虑各种选项。这就是我来到的原因。为了做你想做的事情,你需要通过一些Castle Windsor集成来复制Automapper功能。示例讨论如何在此处集成两者。

这是我建议使用它。

您可以基于接口为每个DTO/ViewModel对实现自己的映射器

interface Mapper<TSource,TTarget> {
   TTarget ConvertToTarget(TSource source);
   TSource ConvertFromTarget(TTarget target);
}