泛型Repository类中如何通过TMapper调用映射方法实现对象转换
解决方案
要解决这个问题,核心是在Repository基类中注入TMapper的实例——当前代码仅定义了泛型约束,但没有实际可调用的mapper对象。具体修改步骤如下:
1. 注入TMapper实例到Repository基类
修改Repository的构造函数,添加TMapper参数并保存为私有字段:
public abstract class Repository<TDomain, TEntity, TMapper> : IReadWriteRepository<TDomain> where TDomain : Model where TEntity : Entity where TMapper : IMapper<TDomain, TEntity> { private readonly ApplicationDbContext _context; private readonly TMapper _mapper; // 新增mapper字段 // 修改构造函数,注入mapper实例 public Repository(ApplicationDbContext context, TMapper mapper) { _context = context; _mapper = mapper; } // 其他CRUD方法... }
2. 完善CRUD方法中的对象转换
通过_mapper调用转换方法,完成领域模型与实体对象的双向转换:
Get方法(返回领域模型)
public IQueryable<TDomain> Get() { var entities = _context.Set<TEntity>(); // 将实体批量转换为领域模型 return entities.Select(_mapper.ToDomain); }
Add方法(领域模型转实体后入库)
public void Add(TDomain item) { var entity = _mapper.ToEntity(item); _context.Set<TEntity>().Add(entity); }
Update方法(转换后处理实体状态)
public void Update(TDomain item) { var entity = _mapper.ToEntity(item); var entry = _context.Entry<TEntity>(entity); if (entry.State == EntityState.Detached) { _context.Set<TEntity>().Attach(entity); entry.State = EntityState.Modified; } }
Delete方法(无需转换,直接操作实体)
建议增加空引用判断避免异常:
public void Delete(int id) { var entity = _context.Set<TEntity>().Find(id); if (entity != null) { _context.Set<TEntity>().Remove(entity); } }
3. 具体Repository实现示例
当需要实现特定业务的Repository时,只需指定对应的领域模型、实体和Mapper实现类即可:
// 示例:用户Repository public class UserRepository : Repository<User, UserEntity, UserMapper> { public UserRepository(ApplicationDbContext context, UserMapper mapper) : base(context, mapper) { } }
这样就能通过同一个Repository基类,配合不同的Mapper实现,完成不同领域模型与实体的CRUD操作。
内容的提问来源于stack exchange,提问作者KTOV
相关产品推荐
相关产品推荐

