IoC с профилем AutoMapper с использованием Autofac - PullRequest
2 голосов
/ 08 марта 2010

Я использую AutoMapper уже некоторое время. У меня есть настройки профиля:

public class ViewModelAutoMapperConfiguration : Profile
    {
        protected override string ProfileName
        {
            get { return "ViewModel"; }
        }

        protected override void Configure()
        {
            AddFormatter<HtmlEncoderFormatter>();
            CreateMap<IUser, UserViewModel>();

        }
    }

Я добавляю это в маппер, используя следующий вызов:

Mapper.Initialize(x => x.AddProfile<ViewModelAutoMapperConfiguration>());

Однако теперь я хочу передать зависимость в конструктор ViewModelAutoMapperConfiguration, используя IoC. Я использую Autofac. Я читал статью здесь: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx, но я не вижу, как это будет работать с профилями.

Есть идеи? Спасибо

Ответы [ 2 ]

1 голос
/ 08 марта 2010

Ну, я нашел способ сделать это, используя перегрузку AddProfile. Существует перегрузка, которая принимает экземпляр профиля, поэтому я могу разрешить экземпляр до его передачи в метод AddProfile.

0 голосов
/ 24 октября 2017

Один мой клиент задавался вопросом, как и 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 , но большая часть важного кода доступна здесь.

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