自动发现automapper配置

时间:2012-07-30 15:13:56

标签: asp.net-mvc reflection automapper automapper-2 auto-registration

在MVC中创建控制器时,您无需为其进行任何其他注册。添加区域也是如此。只要您的global.asax具有AreaRegistration.RegisterAllAreas()调用,就不需要进行其他设置。

使用AutoMapper,我们必须使用某种CreateMap<TSource, TDestination>调用来注册映射。可以使用静态Mapper.CreateMap明确地执行这些操作,或者从AutoMapper.Profile类派生,覆盖Configure方法,然后从那里调用CreateMap

在我看来,应该能够扫描程序集以查找从Profile扩展的类,如MVC扫描从Controller扩展的类。使用这种机制,不应该只通过创建一个派生自Profile的类来创建映射吗?是否存在任何此类库工具,或者是否存在内置于automapper中的内容?

2 个答案:

答案 0 :(得分:9)

我不知道这样的工具是否存在,但写一个应该是非常简单的:

public static class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(x => GetConfiguration(Mapper.Configuration));
    }

    private static void GetConfiguration(IConfiguration configuration)
    {
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        foreach (var assembly in assemblies)
        {
            var profiles = assembly.GetTypes().Where(x => x != typeof(Profile) && typeof(Profile).IsAssignableFrom(x));
            foreach (var profile in profiles)
            {
                configuration.AddProfile((Profile)Activator.CreateInstance(profile));
            }
        }
    }
}

然后在Application_Start你可以自动装配:

AutoMapperConfiguration.Configure();

答案 1 :(得分:2)

作为对@Darin Dimitrov答案的略微改进,在AutoMapper 5中,您可以给它一个要扫描的程序集列表,如下所示:

//--As of 2016-09-22, AutoMapper blows up if you give it dynamic assemblies
var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                    .Where(x => !x.IsDynamic);
//--AutoMapper will find all of the classes that extend Profile and will add them automatically    
Mapper.Initialize(cfg => cfg.AddProfiles(assemblies));