4

当你在 MVC 中创建一个控制器时,你不需要为它做任何额外的注册。添加区域也是如此。只要你的 global.asax 有一个 AreaRegistration.RegisterAllAreas() 调用,就不需要额外的设置。

使用 AutoMapper,我们必须使用某种CreateMap<TSource, TDestination>调用来注册映射。可以使用 static 显式执行这些操作Mapper.CreateMap,或者通过从类派生AutoMapper.Profile、覆盖方法并从那里Configure调用。CreateMap

在我看来,应该能够扫描程序集以查找扩展自的类,Profile例如 MVC 扫描扩展自Controller. 有了这种机制,难道不能简单地通过创建一个派生自的类来创建映射Profile吗?是否存在任何这样的库工具,或者自动映射器中是否内置了一些东西?

4

2 回答 2

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();
于 2012-07-30T15:18:45.357 回答
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));
于 2016-09-22T20:29:49.827 回答