SOLID和绘制DTO集合
本文关键字:集合 DTO 绘制 SOLID | 更新日期: 2023-09-27 18:01:08
我想在C#中实现从DTO到视图模型的映射。场景:
- 我有一个
List<DTO>
,需要将其映射到List<ViewModel>
- 输入列表包含从
DTO
派生的各种类的实例,例如User
、Product
- 因此,根据DTO,我需要不同的模型实例,例如
UserModel
、ProductModel
(均源自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(
您可以使用一个类来包含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);
}