Где определить сопоставления AutoMapper? - PullRequest
7 голосов
/ 25 апреля 2011

Где в моем приложении ASP.NET MVC я должен определить свои отображения AutoMapper?

Mapper.CreateMap<User, UserViewModel>();

В настоящее время я определяю их в конструкторе BaseController, из которого происходят все мои контроллеры.Это лучшее место?

Ответы [ 3 ]

9 голосов
/ 22 мая 2012

Я думаю, что уже поздно отвечать на вопрос, но, возможно, кто-то может использовать мой ответ.

Я использую Ninject для разрешения зависимостей, поэтому я создал модуль Ninject для AutoMapper.Вот код:

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 голос
/ 11 марта 2015

Как уже упоминалось в в этом ответе , AutoMapper теперь ввел конфигурацию profile для организации вашей конфигурации сопоставления.

Так, например, вы можете определить класс для настройки конфигурации отображения:

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();
}
0 голосов
/ 25 апреля 2011

Код, на который вы ссылаетесь, выглядит как AutoMapper, а не StructureMap.

Если вы используете статический метод Mapper, конфигурация должна выполняться только один раз для каждого AppDomain.Это означает, что лучшее место для размещения кода конфигурации - это запуск приложения, например, файл Global.asax для приложений ASP.NET.Как правило, класс начальной загрузки конфигурации находится в своем собственном классе, и этот класс начальной загрузки вызывается из метода запуска.

http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Home

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...