我通常不会在这里问这种问题,但不幸的是,虽然AutoMapper似乎是一个很好的映射库,但它的文档非常糟糕——没有关于该库方法的 XML 文档,以及我能找到的最官方的在线文档是这个,非常轻快。如果有人有更好的文档,请告诉我。
也就是说,这里的问题是:为什么使用Mapper.Initialize
? 它似乎不是必需的,因为您可以Mapper.CreateMap
立即使用,并且由于没有文档,我不知道要做什么Initialize
。
我通常不会在这里问这种问题,但不幸的是,虽然AutoMapper似乎是一个很好的映射库,但它的文档非常糟糕——没有关于该库方法的 XML 文档,以及我能找到的最官方的在线文档是这个,非常轻快。如果有人有更好的文档,请告诉我。
也就是说,这里的问题是:为什么使用Mapper.Initialize
? 它似乎不是必需的,因为您可以Mapper.CreateMap
立即使用,并且由于没有文档,我不知道要做什么Initialize
。
我在 AutoMapper 用户列表上问过,这个答案基本上说明了原因:
https://groups.google.com/forum/?fromgroups=#!topic/automapper-users/0RgIjrKi28U
这与允许 AutoMapper 进行确定性(随机)优化有关。在性能方面,最好在Initialize
调用中创建所有映射。
初始化运行所有地图创建一次,因此在您进行映射时完成。您可以随时创建映射,但这会减慢您的代码速度,因为映射创建涉及反射。
我发现最好为我的映射代码使用配置文件,并使用以下内容来完成所有设置:
public class AutoMapperConfiguration : IRequiresConfigurationOnStartUp
{
private readonly IContainer _container;
public AutoMapperConfiguration(IContainer container)
{
_container = container;
}
public void Configure()
{
Mapper.Initialize(x => GetAutoMapperConfiguration(Mapper.Configuration));
}
private void GetAutoMapperConfiguration(IConfiguration configuration)
{
var profiles = GetProfiles();
foreach (var profile in profiles)
{
configuration.AddProfile(_container.GetInstance(profile) as Profile);
}
}
private static IEnumerable<Type> GetProfiles()
{
return typeof(AutoMapperConfiguration).Assembly.GetTypes()
.Where(type => !type.IsAbstract && typeof(Profile).IsAssignableFrom(type));
}
}