基于ASP.NET Core 5的多层Web应用如何初始化并使用AutoMapper?
方案2:简易DI改造(更规范的长期维护方案)
你不需要让Web项目直接引用AutoMapper,把服务注册逻辑下沉到下层项目即可:
步骤1:下层项目扩展DI注册方法
首先在DataAccess项目中新增服务注册扩展类,需要先安装Microsoft.Extensions.DependencyInjection.Abstractions NuGet包:
using Microsoft.Extensions.DependencyInjection; using AutoMapper; namespace DataAccess { public static class DataAccessServiceRegistration { public static IServiceCollection AddDataAccessServices(this IServiceCollection services) { // 注册AutoMapper,扫描当前层的所有映射配置 services.AddAutoMapper(typeof(MapperProfile).Assembly); // 注册你的所有数据访问器 services.AddScoped<ProjectDataAccessor>(); // 其他DataAccess层服务都在这里注册 return services; } } }
然后在BusinessLogic项目中同样新增扩展类:
using Microsoft.Extensions.DependencyInjection; using DataAccess; namespace BusinessLogic { public static class BusinessLogicServiceRegistration { public static IServiceCollection AddBusinessLogicServices(this IServiceCollection services) { // 引入DataAccess层的服务注册 services.AddDataAccessServices(); // 注册你的所有Manager类 services.AddScoped<ProjectManager>(); // 其他BusinessLogic层服务都在这里注册 return services; } } }
步骤2:Web项目注册服务
在Web项目的Startup.cs或者.NET 6+的Program.cs中,只需调用BusinessLogic层的扩展方法即可,不需要引用AutoMapper:
// Program.cs示例 var builder = WebApplication.CreateBuilder(args); // 注册业务层所有服务,AutoMapper会自动在下层完成注册 builder.Services.AddBusinessLogicServices(); // 其他原有配置不变
步骤3:构造函数注入使用
各个层通过构造函数注入依赖即可,不需要手动new实例:
- DataAccess访问器注入IMapper:
public class ProjectDataAccessor { private readonly IMapper _mapper; private readonly YourDbContext _context; // 构造函数注入AutoMapper实例和DbContext public ProjectDataAccessor(IMapper mapper, YourDbContext context) { _mapper = mapper; _context = context; } public List<Project> GetProjects() { List<Project> projects = new List<Project>(); foreach (TblProject tblProject in _context.TblProjects) { Project project = _mapper.Map<Project>(tblProject); projects.Add(project); } return projects; } }
- BusinessLogic层Manager注入对应访问器:
public class ProjectManager { private readonly ProjectDataAccessor _projectDataAccessor; public ProjectManager(ProjectDataAccessor projectDataAccessor) { _projectDataAccessor = projectDataAccessor; } public List<Project> GetProjects() { return _projectDataAccessor.GetProjects(); } }
- 控制器直接注入Manager,不需要手动using创建实例:
[ApiController] [Route("api/[controller]")] public class ProjectController : ControllerBase { private readonly ProjectManager _projectManager; public ProjectController(ProjectManager projectManager) { _projectManager = projectManager; } [HttpGet] public IEnumerable<Project> GetProjects() { return _projectManager.GetProjects(); } }
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

