2016-04-14 2 views
2

Я перехожу на newer configuration из AutoMapper. Я смотрел примеры на AutoMapper GitHub Wiki и немного запутался в том, как завершить настройку. Wiki говорит, что в одном месте вы можете хранить экземпляр MapperConfiguration в своем D.I. контейнер (или сохранить его статически), но в следующем абзаце говорится, что вы можете хранить экземпляр Mapper статически. В двух словах, я не уверен, что я должен делатьПри переносе на AutoMapper 4.2/5.0 следует ли хранить экземпляр IMapper или экземпляр MapperConfiguration в контейнере для инъекций зависимостей?

var config = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Foo, Bar>().ReverseMap(); //creates a bi-directional mapping between Foo & Bar 
    cfg.AddProfile<FooProfile>(); //suppose FooProfile creates mappings... 
}); 

затем с использованием D.I. контейнер, такие как Unity, чтобы сохранить этот экземпляр как таковые ...

container.RegisterInstance<MapperConfiguration>(config); 

Где я мог бы впоследствии использовать этот экземпляр для выполнения отображения ...

public void CreateMapping(MapperConfiguration config, Bar bar) 
{ 
    Foo foo = config.CreateMapper().Map(bar); 
    //do stuff with foo 
} 

или, я должен хранить IMapper экземпляр в MapperConfiguration делает

container.RegisterInstance<IMapper>(config.CreateMapper()); 

, который имел бы использование следующим образом

public void CreateMapping(IMapper mapper, Bar bar) 
{ 
    Foo foo = mapper.Map(bar); 
    //do stuff with foo 
} 

Все, что я буду делать в своем приложении после того, как начальная конфигурация вызывает метод Map. Мне не нужно будет изменять конфигурацию. Должен ли я хранить экземпляр IMapper или экземпляр MapperConfiguration в контейнере для инъекций зависимостей?

Обновление: Я закончил с регистрацией IMapper с моим D.I. контейнер. В моем случае, Единство.

ответ

2

Я не понимаю, почему вы не могли сохранить оба. У меня есть случаи, когда мне нужно вводить один или другой или оба, поскольку я использую MapperConfiguration для прогнозов LINQ и IMapper для выполнения самого отображения. Мои регистрации IoC выглядеть следующим образом:

public static Container RegisterAutoMapper(this Container container) 
{ 
    var profiles = typeof(AutoMapperRegistry).Assembly.GetTypes().Where(t => typeof(Profile).IsAssignableFrom(t)).Select(t => (Profile)Activator.CreateInstance(t)); 

    var config = new MapperConfiguration(cfg => 
    { 
     foreach (var profile in profiles) 
     { 
      cfg.AddProfile(profile); 
     } 
    }); 

    container.Register<MapperConfiguration>(() => config); 
    container.Register<IMapper>(() => container.GetInstance<MapperConfiguration>().CreateMapper()); 

    return container; 
} 

}

В качестве объекта IMapper может быть создан MapperConfiguration, мой IoC является нерест в IMapper экземпляр из текущей регистрации MapperConfiguration.

+1

Какая версия вы используете? Это зависит от версии 4 - до версии 5, она изменилась. Есть некоторые устаревшие вещи, и есть несколько новых рекомендаций. – alltej

+0

@alltej Вы могли бы указать, что это за изменения? Я пытаюсь перейти на версию 5. – Shago

Смежные вопросы