ASP.NET Core 中多个应用程序的 Automapper 配置和依赖注入

Automapper Configuration and Dependency Injection in ASP.NET Core for mutliple Apps

请原谅我这么长的解释,这是为了提及我的问题的所有细节。

我正在使用 .NET Core,想知道放置 AutoMapper 配置的最佳位置在哪里?我应该从哪里调用它?将公共服务注入多个 ASP.NET 核心应用程序的最佳方式是什么。

现在的情况是这样的,我有以下几点:

  1. Angular2 应用程序(客户端)
  2. 资源 API(ASP.NET 核心应用 API 秒)
  3. 身份验证 API(ASP.NET 核心应用 API 秒)
  4. 服务层(Class 库)
  5. 存储库层(Class 库)
  6. 核心(Class 库)

在存储库层,我有我的 Entity Framework classes(EntityModels 文件夹),我有我的存储库实现,我在其中使用 EF 获取数据。映射发生在这个级别:

    public User Get(int id)
    {
        using (var securityDb = new SecurityContext())
        {
           var record = securityDb.Users.Where(u => u.UserId == id).SingleOrDefault();

           return AutoMapper.Mapper.Map<User>(record);
        }
    }

在 Core 项目中,我有我的域和 dto classes,它们从 Repository 层返回到服务层。

服务和存储库项目都引用核心 Class 库。

现在,我应该注册所有依赖项,这是 "ConfigureServices" 身份验证中的启动方法 API 我通过调用映射 class 方法配置 AutoMapper 的项目。

services.AddTransient<SecurityCore.RepositoryContracts.IUserRepository, SecurityCore.Repositories.UserRepository>();
 services.AddTransient<SecurityCore.ServiceContracts.IUserService, SecurityCore.Services.UserService>();

//Automapper configuration
  SecurityCore.Repositories.EntityModels.Mappings.Configure();

我在存储库项目中有映射 class,如上图所示:

  public class Mappings
{
    public static void Configure()
    {
        AutoMapper.Mapper.Initialize(cm => cm.CreateMap<EntityModels.Users, Models.User>());
    }
}

这是我的一些问题:

我不能说我是架构专家,我不确定在“.NET Core 时代”我们的项目应该有多细化的最佳实践是什么。

但是,here is a sample project 我正在将实现 AutoMapper 和 Autofac 的现有代码移植到新的 ASP.NET 核心 MVC 解决方案。

我的示例代码将 AutoMapper 映射接口放置在包含域模型的业务逻辑层 (BLL) 库中。这些接口的实现以及配置(AutoMapper Profiles)在数据访问层(DAL)的单独项目中。这种安排有助于在不接触 BLL 的情况下换出映射引擎。

配置在 AutoMapper 初始化期间执行,在 ASP.NET 核心解决方案中通过 Startup.ConfigureServices() 调用。

和我的示例代码,用于更新我的 AutoMapper 和 Autofac 实现。

我假设您将存储库接口放入与模型相同的 BLL 库中,并在 DAL 中实现这些存储库接口。这是我所理解的“最佳实践”,将使您能够在不接触 BLL 的情况下更改对象关系映射器 (ORM)。

我建议对您的代码进行以下更改:

  • 将存储库中的映射逻辑重构到 DAL(单一责任主体)中的单独项目中
  • 为来自 AutoMapper.Profile
  • 的 classes 中的每个域模型配置映射
  • 在您的服务中执行域模型和数据传输对象 (DTO) 之间的映射 classes
  • 通过您的启动项目初始化和配置 AutoMapper 一次

至于依赖注入(DI):

  • DI 容器通过您的启动项目实例化一次
  • 服务是通过 class 构造函数注入的

以下有关 DI 的文章值得回顾:

  • docs.asp.net/en/latest/fundamentals/dependency-injection.html
  • wildermuth.com/2016/08/07/ASP-NET-Core-Dependency-Injection
  • docs.autofac.org/en/latest/integration/aspnetcore.html