特定目的地的默认映射
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
实例。
今天我使用 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
实例。