我继承了一个使用 AutoMapper 和 AutoMapper.Attributes NuGet包的项目。在ViewModels中,将 [MapsFrom ...] 属性放在属性上,以从源属性中识别映射。最近,我们重新设计了该应用程序,将数据模型分离到一个单独的C#库中(它们都位于Website项目中),不幸的是 AutoMapper.Attributes 会破坏 [MapsFrom ...] 和相关属性的错误(它们会被忽略,从而导致ViewModel中的属性最终为Null)。
AutoMapper.Attributes 项目已被正式放弃,所有者不再推荐使用它,这意味着 该错误将永远不会得到解决 ,您可以在此处阅读:https://github.com/schneidenbach/AutoMapper.Attributes/issues/26
话虽如此,我们有一段代码包含ViewModel类型,检查了该类型的自定义属性,以查找 [MapsFrom ...] ,并以此确定该ViewModel的源类型。我们在运行时不知道源类型,需要通过AutoMapper映射确定对象的源类型是什么(即通过 CreateMap设置为源的Entity Framework DbSet) (...) 。事实证明,这很难解决,经过大量研究,我正在向你们寻求帮助。
我所拥有的:
这是当前方法的外观,显然,由于我们不得不删除[MapsFrom ....]属性,因此该方法不再有效:
internal static Type GetSourceType(Type viewModelType)
{
if (!(viewModelType.GetCustomAttributes(typeof(MapsFromAttribute), true).FirstOrDefault() is MapsFromAttribute mapsFromAttribute))
{
throw new Exception("The view model class named " + $"{viewModelType.Name} is not decorated with MapsFrom attribute");
}
var destinationType = mapsFromAttribute.SourceType;
return destinationType;
}
我需要什么:
我需要修改上面的方法,以便在将ViewModel类型传递给方法时,我可以提取映射到该ViewModel的源类型。让我们来看一个示例,如果下面有Mapping:
CreateMap<User, UserViewModel>();
将 UserViewModel 传递给方法时,我需要确定其源类型为 User 碰巧也是EntityFramework DbSet,但这对本次讨论并不重要)。
FindTypeMapFor 方法(如下所示)将无济于事,因为您必须为其提供源实体,而这正是我想要发现的。
TypeMap typeMap = AutoMapper.Mapper.Instance.ConfigurationProvider.FindTypeMapFor(TDto, TEntity>();
请注意: :我们使用的是AutoMapper 8.0版,我们在 Profile 类中拥有所有CreateMap(...)语句,我们不再使用属性了。