我刚开始在我的MVC 3项目中使用AutoMapper,我想知道人们在使用它时如何构建他们的项目。我创建了一个MapManager
,它只有一个SetupMaps
方法,我在global.asax中调用它来创建初始地图配置。我还需要使用ValueResolver
作为我的一个映射。对我来说,这个特定的ValueResolver
将在几个不同的地方需要,并且只会从Article.GenerateSlug
返回一个值。
所以我的问题是:
Mapper.CreateMap
)?ValueResolver
的课程放在项目中?您是在Model文件夹下创建子文件夹还是其他东西?感谢您的帮助。
答案 0 :(得分:3)
我不会将问题2作为其真正的个人偏好,但对于1我通常使用一个或多个AutoMapper.Profile
来保存我的Mapper.CreateMap
用于特定目的(domaintoviewmodel等)。
public class ViewModelToDomainAutomapperProfile : Profile
{
public override string ProfileName
{
get
{
return "ViewModelToDomain";
}
}
protected override void Configure()
{
CreateMap<TripRegistrationViewModel, TripRegistration>()
.ForMember(x=>x.PingAttempts, y => y.Ignore())
.ForMember(x=>x.PingResponses, y => y.Ignore());
}
}
然后我创建一个配置Mapper的引导程序(IInitializer
),添加我的所有配置文件。
public class AutoMapperInitializer : IInitializer
{
public void Execute()
{
Mapper.Initialize(x =>
{
x.AddProfile<DomainToViewModelAutomapperProfile>();
x.AddProfile<ViewModelToDomainAutomapperProfile>();
});
}
}
然后在我的global.asax中获取IInitializer
的所有实例并循环运行Execute()
。
foreach (var initializer in ObjectFactory.GetAllInstances<IInitializer>())
{
initializer.Execute();
}
这是我的总体战略。
按要求,这是最后一步的反思实施。
var iInitializer = typeof(IInitializer);
List<IInitializer> initializers = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => iInitializer.IsAssignableFrom(p) && p.IsClass)
.Select(x => (IInitializer) Activator.CreateInstance(x)).ToList();
foreach (var initializer in initializers)
{
initializer.Execute();
}