ASP.NET Core 中多个应用程序的 Automapper 配置和依赖注入
Automapper Configuration and Dependency Injection in ASP.NET Core for mutliple Apps
请原谅我这么长的解释,这是为了提及我的问题的所有细节。
我正在使用 .NET Core,想知道放置 AutoMapper 配置的最佳位置在哪里?我应该从哪里调用它?将公共服务注入多个 ASP.NET 核心应用程序的最佳方式是什么。
现在的情况是这样的,我有以下几点:
- Angular2 应用程序(客户端)
- 资源 API(ASP.NET 核心应用 API 秒)
- 身份验证 API(ASP.NET 核心应用 API 秒)
- 服务层(Class 库)
- 存储库层(Class 库)
- 核心(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>());
}
}
这是我的一些问题:
我是否应该创建一个单独的项目来 bootstrap 所有映射配置,但这意味着该项目应该同时引用 Core 和 Repositories 项目(而不是在 Repositories 中有映射配置)
是否应该在 ASP.NET Core 进行自动映射配置
和我一样吗?
如何注入在两个 ASP.NET 核心项目中重复的依赖代码,如何分离 bootstrapping 过程?是否应该在每个应用程序中调用一次?
我不能说我是架构专家,我不确定在“.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
请原谅我这么长的解释,这是为了提及我的问题的所有细节。
我正在使用 .NET Core,想知道放置 AutoMapper 配置的最佳位置在哪里?我应该从哪里调用它?将公共服务注入多个 ASP.NET 核心应用程序的最佳方式是什么。
现在的情况是这样的,我有以下几点:
- Angular2 应用程序(客户端)
- 资源 API(ASP.NET 核心应用 API 秒)
- 身份验证 API(ASP.NET 核心应用 API 秒)
- 服务层(Class 库)
- 存储库层(Class 库)
- 核心(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>());
}
}
这是我的一些问题:
我是否应该创建一个单独的项目来 bootstrap 所有映射配置,但这意味着该项目应该同时引用 Core 和 Repositories 项目(而不是在 Repositories 中有映射配置)
是否应该在 ASP.NET Core 进行自动映射配置 和我一样吗?
如何注入在两个 ASP.NET 核心项目中重复的依赖代码,如何分离 bootstrapping 过程?是否应该在每个应用程序中调用一次?
我不能说我是架构专家,我不确定在“.NET Core 时代”我们的项目应该有多细化的最佳实践是什么。
但是,here is a sample project 我正在将实现 AutoMapper 和 Autofac 的现有代码移植到新的 ASP.NET 核心 MVC 解决方案。
我的示例代码将 AutoMapper 映射接口放置在包含域模型的业务逻辑层 (BLL) 库中。这些接口的实现以及配置(AutoMapper Profiles)在数据访问层(DAL)的单独项目中。这种安排有助于在不接触 BLL 的情况下换出映射引擎。
配置在 AutoMapper 初始化期间执行,在 ASP.NET 核心解决方案中通过 Startup.ConfigureServices() 调用。
我假设您将存储库接口放入与模型相同的 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