统一容器 - 自动映射器和请求特定资源



我正在考虑为我正在编写的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);
    }
}

在自定义类型转换器中,无需执行任何特定于成员的映射。每当自动映射器看到字符串 -> 国家/地区转换时,它都会使用上述类型转换器。

相关内容

  • 没有找到相关文章

最新更新