特定目的地的默认映射

时间:2019-07-16 08:46:34

标签: c# entity-framework automapper

今天,我将Entity框架与Automapper一起使用以映射到视图模型。每个类或多或少都有一个或多个对User-table / User-class的引用(我自己的,不在Identity-namespace中)。

由于现在正在从数据库映射用户,因此此速度越来越慢。每行1个,或全部取决于延迟加载。

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

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

1 个答案:

答案 0 :(得分:1)

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的每个映射。我只是在这里返回一个静态实例,但是,如果您想从其他地方访问数据,则可以将其他依赖项注入到此类中(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; }
}

哪个会产生以下输出:

enter image description here

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