MVC 3: AutoMapper и структура проекта / решения - PullRequest
4 голосов
/ 14 июля 2011

Я только начал использовать AutoMapper в своем проекте MVC 3, и мне интересно, как люди здесь структурируют свои проекты при его использовании. Я создал MapManager, у которого просто есть метод SetupMaps, который я вызываю в global.asax для создания исходных конфигураций карты. Мне также нужно использовать ValueResolver для одного из моих отображений. Для меня этот конкретный ValueResolver понадобится в нескольких разных местах и ​​просто вернет значение из Article.GenerateSlug.

Итак, мои вопросы:

  1. Как вы управляете первоначальным созданием всех ваших карт (Mapper.CreateMap)?
  2. Где вы помещаете классы для ваших ValueResolver в ваш проект? Вы создаете подпапки в папке Model или что-то еще целиком?

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 15 июля 2011

я не буду говорить на вопрос 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());
    }
}

затем я создаю загрузчик (IInitializer), который настраивает Mapper, добавляя все мои профили.

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();
}
...