夫婦選擇這裏。一個是做自定義解析:(假設COUNTRYCODE是一個字符串可能是一個字符串,等等)
.ForMember(dest => dest.Country, opt => opt.ResolveUsing<CountryCodeResolver>())
那麼你的解析器會:
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都會看到一個字符串 - >國家轉換,它使用上面的類型轉換器。
感謝您提供豐富的答案!不幸的是,在配置automapper的時候,我沒有對容器的引用,因爲容器將是收到請求時由主容器創建的子容器。 – 2011-05-24 14:19:52