AutoMapper-根据目标类型确定源类型

时间:2019-03-10 17:20:49

标签: c# automapper viewmodel

我继承了一个使用 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(...)语句,我们不再使用属性了。

0 个答案:

没有答案