【问题标题】:AddAutoMapper does not load all assemblies in asp.net coreAddAutoMapper 不会在 asp.net 核心中加载所有程序集
【发布时间】:2019-09-27 07:04:23
【问题描述】:

我有以下代码将自动映射器添加到我的应用程序中。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddHttpClient();

    services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
}

AppDomain.CurrentDomain.GetAssemblies() 仅返回在调用它时加载的程序集。 我可以看到我的一些包含我的映射的程序集尚未加载,因此未加载映射,这会返回有关缺少映射类型的错误。

如何获取项目引用的所有程序集?

【问题讨论】:

  • 为什么需要传递参数 services.AddAutoMapper 方法。您可以像 services.AddAutoMapper() 一样直接调用它。它对我来说很好。此外,您是否创建了继承自 Profile 的 Automapper Profile 类?
  • 是的,我已经创建了配置文件。 AddAutoMapper() 被标记为过时
  • AppDomain.CurrentDomain.GetAssemblies() 仅返回在调用它时加载的程序集” – 所以它是按设计工作的。如果您想要其他程序集,则直接传递这些程序集。
  • 这就是 no params 重载已过时的确切原因 :) 您可以显式传递程序集,或编写代码自行加载它们。
  • 应用程序启动期间没有加载哪个程序集?是否有任何演示可以重现您的问题?

标签: c# asp.net-core .net-core automapper


【解决方案1】:

Reference - From official AutoMapper docs

ASP.NET Core

有一个NuGet packagehere 描述的默认注入机制一起使用,并在this project 中使用。

您使用profiles 定义配置。然后你让 AutoMapper 知道哪些程序集是由定义的那些配置文件 调用IServiceCollection 扩展方法AddAutoMapper at 启动:

services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);

或标记类型:

services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);

现在您可以在运行时将 AutoMapper 注入您的服务/控制器:

public class EmployeesController {
    private readonly IMapper _mapper;

    public EmployeesController(IMapper mapper) => _mapper = mapper;

    // use _mapper.Map or _mapper.ProjectTo
}

【讨论】:

  • 我一直在寻找一种方法来避免一个一个地明确指定程序集。我想没有任何方法可以获取所有引用的程序集,所以我必须明确设置它们
  • 第一次使用程序集时,它们将被加载到应用程序域中。所以,是的,你应该明确指定 typeof(Profile) 并且最终会加载程序集。
  • 正如我在最初的帖子中已经说过的那样,我知道如何明确地做到这一点。我正在寻找的是找到一种方法来获取引用的程序集
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多