今天,我将Entity框架与Automapper一起使用以映射到视图模型。每个类或多或少都有一个或多个对User-table / User-class的引用(我自己的,不在Identity-namespace中)。
由于现在正在从数据库映射用户,因此此速度越来越慢。每行1个,或全部取决于延迟加载。
是否可以通过某种方式为Automapper设置默认行为,以便当目标是UserViewModel时,是否可以使用内存中列表而不是数据库来解决?
我当然可以在我的地图配置中使用ResolveUsing来映射它,但是我宁愿不按类型进行此操作,因为这是一个大项目。
答案 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; }
}
哪个会产生以下输出:
您可以看到,从任何源类型进行映射时,都创建并返回了一个UserViewModel
实例。