我正在考虑为我正在编写的asp mvc内部网应用程序使用自动映射器。我的控制器目前是使用 Unity 依赖项注入创建的,其中每个容器都获取请求唯一的依赖项。
我需要知道是否可以使自动映射器使用特定于请求的资源 ICountryRepository 来查找对象,就像这样......
domainObject.Country = CountryRepository.Load(viewModelObject.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 挂接到自动映射器:
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);
}
}
在自定义类型转换器中,无需执行任何特定于成员的映射。每当自动映射器看到字符串 -> 国家/地区转换时,它都会使用上述类型转换器。