17

我通常不会在这里问这种问题,但不幸的是,虽然AutoMapper似乎是一个很好的映射库,但它的文档非常糟糕——没有关于该库方法的 XML 文档,以及我能找到的最官方的在线文档是这个,非常轻快。如果有人有更好的文档,请告诉我。

也就是说,这里的问题是:为什么使用Mapper.Initialize? 它似乎不是必需的,因为您可以Mapper.CreateMap立即使用,并且由于没有文档,我不知道要做什么Initialize

4

2 回答 2

9

我在 AutoMapper 用户列表上问过,这个答案基本上说明了原因:

https://groups.google.com/forum/?fromgroups=#!topic/automapper-users/0RgIjrKi28U

这与允许 AutoMapper 进行确定性(随机)优化有关。在性能方面,最好在Initialize调用中创建所有映射。

于 2012-10-22T14:23:19.233 回答
7

初始化运行所有地图创建一次,因此在您进行映射时完成。您可以随时创建映射,但这会减慢您的代码速度,因为映射创建涉及反射。

我发现最好为我的映射代码使用配置文件,并使用以下内容来完成所有设置:

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));
    }
}
于 2012-10-19T15:34:19.620 回答