c# - 在 ITypeConverter 中使用 Automapper

标签 c# automapper

我正在项目中升级 AutoMapper,从静态 Mapper.CreateMap 转换为新方式,并在我需要映射的地方注入(inject)一个 IMapper

除一个用异常(exception),一切进展顺利。我有几个用于使用 Mapper.Map 函数的复杂映射的 ITypeConverter。我怎样才能解决这个问题?以下是我目前正在使用的代码。

静态 Mapper.Map 找不到我定义的映射,因为它们不是使用静态方法创建的。

public partial class ApplicationMappingsProfile
{
    private void RegisterMappings()
    {
        CreateMap<Application, AppDto>()
            .ConvertUsing<ApplicationTypeConverter>();
    }
}

private class ApplicationTypeConverter : ITypeConverter<App, AppDto>
{
    public AppDto Convert(ResolutionContext context)
    {
        var src = context.SourceValue as App;
        if (src == null)
        {
            return null;
        }

        var dto = Mapper.Map<App, AppDto>(src);
        dto.property = Mapper.Map<Property>(src.SomeProperty);

        return result;
    }
}

最佳答案

ResolutionContext 包含对当前映射引擎的引用。将 Mapper.Map 切换为 context.Engine.Mapper.Map 就可以了。

public partial class ApplicationMappingsProfile
{
    private void RegisterMappings()
    {
        CreateMap<Application, AppDto>()
            .ConvertUsing<ApplicationTypeConverter>();
    }
}

private class ApplicationTypeConverter : ITypeConverter<App, AppDto>
{
    public AppDto Convert(ResolutionContext context)
    {
        var src = context.SourceValue as App;
        if (src == null)
        {
            return null;
        }

        var dto = Mapper.Map<App, AppDto>(src);
        dto.property = context.Engine.Mapper.Map.Map<Property>(src.SomeProperty);

        return result;
    }
}

关于c# - 在 ITypeConverter 中使用 Automapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796295/

相关文章:

c# - 在 C# 正则表达式中将\r 视为\n

c# - while(reader.Read()) {} 中列表中的重复值

c# - 在 MVVM 世界中更改 CollectionViewSource 源

c# - 使用 Unity 注入(inject)特定实现

c# - 如果遇到不止一次,使自动映射器缓存对象

c# - 使用 ValueInjecter 扁平化对象,包括可空类型

c# - 自动映射器前提条件,如果 src 值为 0,则映射 null

c# - 在 Entity Framework 中合并

c# - 找到自动映射器未映射的成员

asp.net-core - 在 AutoMapper 配置文件中获取登录用户