特定目的地的默认映射

Default mapping for specific destination

今天我使用 Entity framework 和 Automapper 一起映射到视图模型。每个 class 或多或少都有 1 个或多个对 User-table/User-class 的引用(我自己的,不在身份命名空间中)。

由于今天正在从数据库映射用户,因此速度越来越慢。每行 1 个,或全部一起,具体取决于延迟加载与否。

是否有可能以某种方式为 Automapper 设置默认行为,以便当目标是 UserViewModel 时,它是否会使用内存列表而不是数据库来解析?

我当然可以在我的地图配置上使用 ResolveUsing 来映射它,但我不想按类型执行此操作,因为这是一个大型项目。

A Custom Type Converter 在这里可能对您有用。它们在全局范围内指定两种类型之间的映射。因此,您可以在 AutoMapper 配置中定义一次转换,它将应用于这些类型的任何映射。

下面是一个示例:

public class UserViewModelConverter : ITypeConverter<object, UserViewModel>
{
    private static readonly UserViewModel _instance = new UserViewModel
    {
        Foo = "StaticValue"
    };

    public UserViewModel Convert(object source, UserViewModel destination, ResolutionContext context)
    {
        return _instance;
    }
}

将源设置为 object 将使此转换器适用于源为对象且目标为 UserViewModel 的每个映射。我只是在这里返回一个静态实例,但是如果您想从其他地方访问数据,您可以将其他依赖项注入到此 class 中(ITypeConverter 的实现将暂时解析)。


下面是这个工作的完整示例:

class Program
{
    static void Main(string[] args)
    {
        IMapper mapper = new MapperConfiguration(config =>
        {
            config.CreateMap<object, UserViewModel>().ConvertUsing<UserViewModelConverter>();
        }).CreateMapper();

        UserViewModel viewModelFromOne = mapper.Map<UserViewModel>(new SourceOne { Foo = "One" });
        UserViewModel viewModelFromTwo = mapper.Map<UserViewModel>(new SourceTwo { Foo = "Two" });

        Console.WriteLine($"Foo from One {viewModelFromOne.Foo}");
        Console.WriteLine($"Foo from Two {viewModelFromTwo.Foo}");

        Console.ReadLine();
    }
}

public class UserViewModelConverter : ITypeConverter<object, UserViewModel>
{
    private static readonly UserViewModel _instance = new UserViewModel
    {
        Foo = "StaticValue"
    };

    public UserViewModel Convert(object source, UserViewModel destination, ResolutionContext context)
    {
        return _instance;
    }
}

public class SourceOne
{
    public string Foo { get; set; }
}

public class SourceTwo
{
    public string Foo { get; set; }
}

public class UserViewModel
{
    public UserViewModel()
    {
        Console.WriteLine("Instantiating UserViewModel...");
    }

    public string Foo { get; set; }
}

产生以下输出:

您可以看到从任何源类型进行映射时都会创建并返回一个 UserViewModel 实例。