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

如何在泛型Repository中实现DTO类与Model类的映射

解决方案:泛型仓库中实现DTO与Model的映射

针对你在泛型Repository的Add方法中无法处理DTO和Model双向映射的问题,最直接清晰的方案是将泛型仓库改为双泛型(同时支持DTO和Model类型),结合AutoMapper完成类型转换。以下是分步实现:

1. 修改仓库接口为双泛型

首先更新IRepository,明确指定DTO和Model两个泛型参数:

namespace DTOMap.Domain.Interface
{
    public interface IRepository<TDto, TModel> 
        where TDto : class
        where TModel : class
    {
        TDto Add(TDto obj);
    }
}

2. 重构泛型Repository类

修改Repository为双泛型实现,同时通过依赖注入获取IMapper(避免在构造函数内自行创建Mapper实例,符合.NET依赖注入规范):

namespace DTOMap.Core.Repository.Generic
{
    public class Repository<TDto, TModel> : IRepository<TDto, TModel> 
        where TDto : class
        where TModel : class
    {
        private readonly DTOMapContext _context;
        private readonly DbSet<TModel> _table;
        private readonly IMapper _mapper;

        public Repository(DTOMapContext context, IMapper mapper)
        {
            _context = context;
            _table = _context.Set<TModel>();
            _mapper = mapper;
        }

        public TDto Add(TDto obj)
        {
            // 1. 将DTO映射为数据库实体Model
            var model = _mapper.Map<TModel>(obj);
            // 2. 添加实体到DbSet
            var addedModel = _table.Add(model).Entity;
            // 3. 保存更改到数据库(必须调用,否则不会生成自增ID等数据库操作)
            _context.SaveChanges();
            // 4. 将保存后的Model映射回DTO返回
            return _mapper.Map<TDto>(addedModel);
        }
    }
}

3. 修正依赖注入配置

在Program.cs中正确注册AutoMapper和双泛型仓库:

// 注册AutoMapper,自动扫描程序集中的Profile(比如你的MyMapper)
builder.Services.AddAutoMapper(typeof(MyMapper));

// 注册仓库,明确指定DTO和对应的Model类型
builder.Services.AddTransient<IRepository<BookDTO, Book>, Repository<BookDTO, Book>>();
builder.Services.AddTransient<IRepository<AuthorDTO, Author>, Repository<AuthorDTO, Author>>();

关键注意事项

  • 访问修饰符检查:你的Author和Book类是internal,如果Repository和Model不在同一个程序集,需要将Model改为public,否则会出现访问权限问题。
  • AutoMapper映射配置:确保MyMapper中的映射规则正确(你当前的配置已经覆盖了DTO和Model的双向映射,无需修改)。
  • SaveChanges调用:必须调用_context.SaveChanges(),否则数据库不会写入数据,返回的DTO也无法获取数据库生成的ID值。

内容的提问来源于stack exchange,提问作者antoine_d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:15:41