我刚刚开始在我的 MVC 3 项目中使用 AutoMapper,我想知道这里的人们在使用它时如何构建他们的项目。我创建了一个 MapManager
,它只有一个 SetupMaps
方法,我在 global.asax 中调用该方法来创建初始 map 配置。我还需要为我的映射之一使用 ValueResolver
。对我来说,这个特定的 ValueResolver
将在几个不同的地方需要,并且只会从 Article.GenerateSlug
返回一个值。
所以我的问题是:
- 如何管理所有 map 的初始创建 (
Mapper.CreateMap
)? - 您将 ValueResolver 的类放在项目中的什么位置?您是否在模型文件夹下创建子文件夹或完全在其他文件夹下?
感谢您的帮助。
最佳答案
我不会谈论问题 2,因为它确实是个人喜好,但对于问题 1,我通常使用一个或多个 AutoMapper.Profile
来保存我所有的 Mapper.CreateMap
用于特定目的(域到 View 模型等)。
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());
}
}
然后我创建一个 Bootstrap (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();
}
关于asp.net-mvc-3 - MVC 3 : AutoMapper and Project/Solution Structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699118/