Automapper и запросить конкретные ресурсы - PullRequest
1 голос
/ 24 мая 2011

Я подумываю об автомате для приложения asp mvc intranet, которое я пишу.Мои контроллеры в настоящее время создаются с использованием внедрения зависимостей Unity, где каждый контейнер получает зависимости, уникальные для запроса.

Мне нужно знать, можно ли заставить autopper использовать ресурс ICountryRepository для конкретного запроса для поиска объекта, например....

domainObject.Country = CountryRepository.Load(viewModelObject.CountryCode);

1 Ответ

3 голосов
/ 24 мая 2011

Пара вариантов здесь.Один из них заключается в создании пользовательского преобразователя:

.ForMember(dest => dest.Country, opt => opt.ResolveUsing<CountryCodeResolver>())

Тогда ваш преобразователь будет (при условии, что CountryCode - строка. Может быть строкой, что угодно):

public class CountryCodeResolver : ValueResolver<string, Country> {
    private readonly ICountryRepository _repository;

    public CountryCodeResolver(ICountryRepository repository) {
        _repository = repository;
    }

    protected override Country ResolveCore(string source) {
        return _repository.Load(source);
    }
}

Наконец, вы 'Вам нужно подключить Unity к AutoMapper:

Mapper.Initialize(cfg => {
    cfg.ConstructServicesUsing(type => myUnityContainer.Resolve(type));

    // Other AutoMapper configuration here...
});

Где myUnityContainer - это настроенный вами контейнер Unity.Пользовательский распознаватель определяет отображение между одним членом и другим.Мы часто определяем глобальный конвертер типов для всех отображений строки -> страны, поэтому мне не нужно настраивать каждый отдельный элемент.Выглядит это так:

Mapper.Initialize(cfg => {
    cfg.ConstructServicesUsing(type => myUnityContainer.Resolve(type));

    cfg.CreateMap<string, Country>().ConvertUsing<StringToCountryConverter>();

    // Other AutoMapper configuration here...
});

Тогда преобразователь будет:

public class StringToCountryConverter : TypeConverter<string, Country> {
    private readonly ICountryRepository _repository;

    public CountryCodeResolver(ICountryRepository repository) {
        _repository = repository;
    }

    protected override Country ConvertCore(string source) {
        return _repository.Load(source);
    }
}

В преобразователе пользовательских типов вам не потребуется выполнять сопоставление для конкретного элемента.Каждый раз, когда AutoMapper видит строку -> Преобразование страны, он использует приведенный выше преобразователь типов.

...