C# 特定目的地的默认映射

C# 特定目的地的默认映射,c#,entity-framework,automapper,C#,Entity Framework,Automapper,今天,我使用实体框架和Automapper来映射到viewmodels。或多或少,每个类都有一个或多个对用户表/用户类的引用(我自己的,不在标识命名空间中) 由于现在is正在从数据库映射用户,所以速度越来越慢。每行1个,或全部,取决于是否延迟加载 是否有可能以某种方式为Automapper设置默认行为,以便在目标为UserViewModel时,它将使用内存中的列表而不是数据库进行解析 当然,我可以在映射配置中使用ResolveUsing来映射它,但我不希望按类型进行映射,因为这是一个大型项目。a

今天,我使用实体框架和Automapper来映射到viewmodels。或多或少,每个类都有一个或多个对用户表/用户类的引用(我自己的,不在标识命名空间中)

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

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

当然,我可以在映射配置中使用ResolveUsing来映射它,但我不希望按类型进行映射,因为这是一个大型项目。

a可能适合您。它们在全局范围内指定两种类型之间的映射。因此,您可以在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;
    }
}
将生成以下输出:


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

您可以分享一些有关如何从数据库映射用户的代码吗?谢谢!这正是我要找的。
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; }
}