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