【问题标题】:Using AutoMapper in .NET Core in a Library project在库项目中使用 .NET Core 中的 AutoMapper
【发布时间】:2019-03-21 14:20:58
【问题描述】:

这是解决方案结构:

  • MyProject.WebApplication
  • MyProject.Core
  • MyProject.DAL

服务位于 MyProject.Core。所以我想在来自 MyProject.DAL 的模型之间使用映射。 (Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection)

return _mapper.Map<Core.Model>(DAL.model);

当然反之亦然。

问题是:我需要在两个项目中引用 AutoMapper 吗?

或者在MyProject.Core中创建一个ConfigureAutoMapper类,在MyProject.WebApplication的启动类中调用?

但是这个呢?

services.AddAutoMapper();

【问题讨论】:

标签: c# .net-core automapper


【解决方案1】:

我遇到了同样的问题,为此我想出的最佳解决方案是在我的类库中定义一个扩展方法来进行一些初始化,只是在我调用 AddAutoMapper 之前将其程序集加载到内存中我的 main项目启动.cs:

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

遵循愿望,而不是解决方案:

执行此操作的最佳方法是多次调用 AddAutoMapper 都可以,但不幸的是,根据此讨论已被拒绝:

https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/issues/25

这样我就可以用这样的扩展方法加载我的个人资料了:

 public static class Extensions
{
    public static void AddClassLibraryServices(this IServiceCollection services)
    {
        services.AddAutoMapper(typeof(MyClassLibraryAutoMapperProfile));
    }
}

目前这样做会弄乱在主项目中收集的配置文件的最终列表。

【讨论】:

    【解决方案2】:

    由于两种方式的转换都将在您的服务中完成,只需将 automapper 包装在注入接口中即可。一切都应该在 MyProject.Core 中完成。

    编辑:

    至于服务,这取决于您如何创建它们。本质上,您需要一个映射服务,因此将其创建为任何其他服务并将其注入需要映射的类中。

    我喜欢这种模式:

    public class MyService : IMyService
    {
      public MyService(IDepedencySolver ds, IRepository rep = null, IMapper mapper = null)
      { 
         _rep = rep ?? ds.GetService<IDependencySolver>();
         _mapper = mapper ?? ds.GetService<IMapper>();
    
    
    
        ...
       }
    }
    

    它允许您仅注入服务解析器,如 Autofac/Splat/etc,或在测试中注入所有模拟。

    有些人喜欢将默认解析器作为静态变量,这样你就可以避免第一个参数。

    所以,要回答您是否需要在两个项目中引用 AM 的问题:不,只是在 MyProject.Core 中,您实际使用 Automapper 类的地方。

    您应该将它们包装在IMapperService 或类似的东西中。然后,在 MVC 中,当您注册服务时,您注册了 new MapperService() 的实例 - 为此您只需要参考 MyProject.Core

    【讨论】:

    • 所以不要使用 services.AddAutoMapper();然后?能举个例子吗?
    • 是 AutoMapper 还是 AutoMapper.Extensions.Microsoft.DependencyInjection?
    • 我没有使用特定的 ASP.NET Core 依赖服务,事实证明,要使用普通 Automapper,您可以按照 this 教程进行操作,但是您需要 AutoMapper.Extensions.Microsoft.DependencyInjection 依赖你的 MVC 项目
    • 是的,但是在那个教程中,一切都是在启动项目中完成的,而不是在核心项目中
    • 是的,您在 MyProject.WebApp 的配置部分创建/注册在 MyProject.Core 中定义的类的实例。如果你想使用 vanilla mapper,那么你需要将 AutoMapper nuget 添加到两个项目中。
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2017-04-28
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多