使用AutoMapper,如果源对象是IQueryable,如何读取配置文件中的设置文件



我在.Net Core 3.1项目中使用AutoMapper。

在其中一个映射配置文件中,对于只存在于目标对象中的成员,我需要根据设置文件(appsettings.json文件(中的值来设置值。

源对象在IQueryable中,它被传递给IMapper.ProjectTo((。因此,根据AutoMapper文档,这将我的选项限制为

  • MapFrom(基于表达式(
  • ConvertUsing(基于表达式(
  • 忽略
  • NullSubstitute
  • 价值转换器
  • IncludeMembers

令人失望的是,我无法使用自定义类型转换器或自定义解析程序。

因此,考虑到这些限制,我一直在尝试使用IOptions注入设置,如下所示。

public class DepartmentProfile : Profile
{
private static IOptions<ApiOptions> _apiOptions;
public DepartmentProfile(IOptions<ApiOptions> apiOptions)
{
_apiOptions = apiOptions;

CreateMap<Media, MediaDto>()
.ForMember(m => m.DepartmentTitle, o => o.MapFrom(src => src.Department.Title))
.ForMember(m => m.DepartmentOption, o => o.MapFrom(src => GetOptionValue()))
}
private static string GetOptionValue()
{
return _apiOptions.Value.Option;
}
}

问题是我不能使用这个方法,因为AutoMapper似乎希望所有的映射配置文件构造函数都是完全无参数的。。。

此外,我正在开发的代码库有大量的映射配置文件,这些配置文件都是使用启动文件中的一行代码自动注册的——我真的没有在启动时手动注册它们,然后向它们传递额外选项的选项。

代码库的架构也使得所有的映射逻辑都必须由概要文件对象本身完成——在自动映射程序完成后,我不能将对象传递给另一个服务(用于进一步的映射(。

有人知道我可以如何将IOptions值注入映射配置文件吗?

另一种方法是创建一个带有默认值参数的方法。

public MediaDto ToDto(this Media entity, string defaultOption)
{
return new MediaDto 
{
DepartmentTitle = entity.DepartmentTitle,
DepartmentOption = defaultOption
};
}

请注意,您应该能够在IQueryable的顶级投影中使用此方法。

var items = query.Where(id => id == givenId)
.Select(entity => ToDto(entity, option.Value))
.ToList();

优点:

  • 其他开发人员可以理解
  • 支持任何类型的映射!!!重要;(
  • 不依赖第三方框架

最新更新