在MVC中创建控制器时,您无需为其进行任何其他注册。添加区域也是如此。只要您的global.asax具有AreaRegistration.RegisterAllAreas()调用,就不需要进行其他设置。
使用AutoMapper,我们必须使用某种CreateMap<TSource, TDestination>
调用来注册映射。可以使用静态Mapper.CreateMap
明确地执行这些操作,或者从AutoMapper.Profile
类派生,覆盖Configure
方法,然后从那里调用CreateMap
。
在我看来,应该能够扫描程序集以查找从Profile
扩展的类,如MVC扫描从Controller
扩展的类。使用这种机制,不应该只通过创建一个派生自Profile
的类来创建映射吗?是否存在任何此类库工具,或者是否存在内置于automapper中的内容?
答案 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));