我应该在ASP.NET MVC应用程序中定义AutoMapper映射吗?
Mapper.CreateMap<User, UserViewModel>();
目前我在BaseController的构造函数中定义了这些,我的所有Controlllers都是从这个构造函数派生出来的。这是最好的地方吗?
答案 0 :(得分:9)
我认为回答这个问题有点迟,但也许有人可以使用我的答案。
我使用Ninject来解决依赖关系,因此我为AutoMapper创建了Ninject模块。这是代码:
public class AutoMapperModule : NinjectModule
{
public override void Load()
{
Bind<IConfiguration>().ToMethod(context => Mapper.Configuration);
Bind<IMappingEngine>().ToMethod(context => Mapper.Engine);
SetupMappings(Kernel.Get<IConfiguration>());
Mapper.AssertConfigurationIsValid();
}
private static void SetupMappings(IConfiguration configuration)
{
IEnumerable<IViewModelMapping> mappings = typeof(IViewModelMapping).Assembly
.GetExportedTypes()
.Where(x => !x.IsAbstract &&
typeof(IViewModelMapping).IsAssignableFrom(x))
.Select(Activator.CreateInstance)
.Cast<IViewModelMapping>();
foreach (IViewModelMapping mapping in mappings)
mapping.Create(configuration);
}
}
正如您在加载时看到的那样,它扫描程序集以实现IViewModelMapping,然后运行Create方法。
以下是IViewModelMapping的代码:
interface IViewModelMapping
{
void Create(IConfiguration configuration);
}
IViewModelMapping的典型实现如下所示:
public class RestaurantMap : IViewModelMapping
{
public void Create(IConfiguration configuration)
{
if (configuration == null)
throw new ArgumentNullException("configuration");
IMappingExpression<RestaurantViewModel, Restaurant> map =
configuration.CreateMap<RestaurantViewModel, Restaurant>();
// some code to set up proper mapping
map.ForMember(x => x.Categories, o => o.Ignore());
}
}
答案 1 :(得分:1)
如this answer所述,AutoMapper现已引入配置profiles来组织您的映射配置。
例如,您可以定义一个类来设置映射配置:
public class ProfileToOrganiseMappings : Profile
{
protected override void Configure()
{
Mapper.CreateMap<SourceModel, DestinationModel>();
//other mappings could be defined here
}
}
然后定义一个类来初始化映射:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile(new ProfileToOrganiseMappings());
//other profiles could be registered here
});
}
}
最后,在global.asax Application_Start()
中调用该类来配置这些映射:
protected void Application_Start()
{
...
AutoMapperWebConfiguration.Configure();
}
答案 2 :(得分:0)
您引用的代码看起来像AutoMapper,而不是StructureMap。
如果您使用的是静态Mapper 方法,配置只需要 每个AppDomain发生一次。这意味着 最好的地方 配置代码在应用程序中 启动,例如Global.asax文件 对于ASP.NET应用程序。通常情况下, 配置bootstrapper类 是在自己的班级,这个 bootstrapper类是从 启动方法。
http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Home