【发布时间】:2022-02-06 13:25:21
【问题描述】:
我在 .Net Core 3.1 项目中使用 AutoMapper。
在其中一个映射配置文件中,对于仅存在于目标对象中的成员,我需要根据设置文件(appsettings.json 文件)中的值设置值。
源对象在一个 IQueryable 中,它通过 IMapper.ProjectTo() 传递。因此,基于on the AutoMapper documentation,这将我的选项限制为
- MapFrom(基于表达式)
- ConvertUsing(基于表达式)
- 忽略
- NullSubstitute
- 价值转换器
- 包括成员
令人失望的是,我无法使用自定义类型转换器或自定义解析器。
鉴于这些限制,我一直在尝试使用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 值注入映射配置文件的方法吗?
【问题讨论】:
-
@LucianBargaoanu 感谢您的反馈。在代码中,我们在 startup.cs 中注册了近 100 个配置文件,其中一行代码调用 services.AddAutoMapper(assembly-name, Assembly.GetExecutingAssembly)。我只需要对 1 个特定配置文件进行参数化。我可以注册它而无需替换此启动功能吗?如果有,怎么做?
-
这不相关。该链接解释了如何使用,并且有许多在线示例。
-
@LucianBargaoanu 感谢您的反馈,但我不知道如何使用链接中的示例;在示例中,使用了 cfg 对象...我无法访问可以调用 CreateProjection() 方法的 cfg 对象;甚至在 Startup.cs 中也没有,因为 startup.cs 只是通过一次调用 services.AddAutoMapper() 来注册所有内容。我看不到在哪里可以注册/创建投影。你能具体说明我可以在哪里注册吗?
-
程序集扫描不允许在配置文件中注入服务。但是您可以通过 DI 引擎解析配置文件实例并将它们添加到
AddAutoMapper。很多人以前都这样做过,以某种方式或另一种方式。
标签: c# .net-core asp.net-web-api automapper