如何在泛型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
相关产品推荐
相关产品推荐

