You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:24:03