Один мой клиент задавался вопросом, как и DownChapel, и его ответ заставил меня написать пример приложения.
Я сделал следующее.
Сначала извлеките все типы Profile
из сборок и зарегистрируйте их в контейнере IoC (я использую Autofac).
var loadedProfiles = RetrieveProfiles();
containerBuilder.RegisterTypes(loadedProfiles.ToArray());
При регистрации конфигурации AutoMapper я разрешаю все типы Profile
и определяю экземпляр из них.
private static void RegisterAutoMapper(IContainer container, IEnumerable<Type> loadedProfiles)
{
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.ConstructServicesUsing(container.Resolve);
foreach (var profile in loadedProfiles)
{
var resolvedProfile = container.Resolve(profile) as Profile;
cfg.AddProfile(resolvedProfile);
}
});
}
Таким образом, ваш IoC-каркас (Autofac) будет разрешать все зависимости Profile
, поэтому он может иметь зависимости.
public class MyProfile : Profile
{
public MyProfile(IConvertor convertor)
{
CreateMap<Model, ViewModel>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Identifier))
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => convertor.Execute(src.SomeText)))
;
}
}
Полный пример приложения можно найти на GitHub , но большая часть важного кода доступна здесь.