在哪里定义AutoMapper映射?

时间:2011-04-25 09:26:03

标签: asp.net-mvc-3 automapper

我应该在ASP.NET MVC应用程序中定义AutoMapper映射吗?

Mapper.CreateMap<User, UserViewModel>();

目前我在BaseController的构造函数中定义了这些,我的所有Controlllers都是从这个构造函数派生出来的。这是最好的地方吗?

3 个答案:

答案 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