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

泛型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:15:44