自动映射器配置文件:展平dto以进行映射



我有一个主类,它有一个嵌套的类。我已经成功地使用它来映射器类

public class Main
{
    public string Name { get; set; }
    public List<QuantityLocation> NC { get; set; }
}
public class NestedClass
{
    public decimal B { get; set; }
    public string A { get; set; }
}
public class Flattened
{
    public string Name { get; set; }
    public string A { get; set; }
    public decimal B { get; set; }
}

使用 Mapper 类完成的映射,如下所示。

    Mapper.CreateMap<NestedClass, Flattened>();
    Mapper.CreateMap<Main, Flattened>();
    Mapper.CreateMap<Main, List<Flattened>>()
        .ConvertUsing(i =>
                i.NC.Select(
                    flat =>
                    {
                        var flatList = Mapper.Map<Flattened>(i);
                        Mapper.Map(flat, flatList);
                        return flatList;
                    }).ToList());

现在,当我将此映射移动到我的 Profile 类时,我不得不将上面的行更改为下面的行:

CreateMap<NestedClass, Flattened>();
CreateMap<Main, Flattened>();
CreateMap<Main, List<Flattened>>()
    .ConvertUsing(i =>
            i.NC.Select(
                flat =>
                {
                    var flatList = Mapper.Map<Flattened>(i);
                    Mapper.Map(flat, flatList);
                    return flatList;
                }).ToList());

我面临的问题是如何在上面的代码片段中转换下面的这两行。

               var flatList = Mapper.Map<Flattened>(i);
                Mapper.Map(flat, flatList);

你看我正在将 Mapper.Engine 注入到我的控制器的构造函数中。早些时候,我只是使用静态映射器类,该类曾经在我的global.asax中被调用。现在我收到如下所示的错误。

Missing type map configuration or unsupported mapping.
Mapping types: Main -> List`1 MyProj.Main -> System.Collections.Generic.List`1[[MyProj.Flattened, MyProj, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
Destination path: List`1
Source value: MyProj.Main

正确的方法是使用自定义类型转换器,在其中注入映射引擎本身。并在配置文件声明中使用 ConstructServicesUsing。

假设您使用了一些 IoC 容器,并且您已在其中注册了映射引擎和自定义类型转换器,您将在转换器内使用引擎。映射而不是静态映射器。

相关内容

  • 没有找到相关文章

最新更新