第四章:仓储模式与工作单元

博客v1.0系列教程(Csharp)博客 v1.0 系列教程 (C#)

4.1 泛型仓储接口

public interface IRepository<T> where T : class, new()
{
    Task<T?> GetByIdAsync(long id);
    Task<List<T>> GetListAsync();
    Task<bool> InsertAsync(T entity);
    Task<bool> UpdateAsync(T entity);
    Task<bool> DeleteAsync(long id);
    ISugarQueryable<T> AsQueryable();
}

4.2 泛型仓储实现

public class Repository<T> : IRepository<T> where T : class, new()
{
    private readonly ISqlSugarClient _db;

    public Repository(ISqlSugarClient db)
    {
        _db = db;
    }

    public async Task<T?> GetByIdAsync(long id)
    {
        return await _db.Queryable<T>().InAsync(id);
    }

    public async Task<List<T>> GetListAsync()
    {
        return await _db.Queryable<T>().ToListAsync();
    }

    public async Task<bool> InsertAsync(T entity)
    {
        return await _db.Insertable(entity).ExecuteCommandAsync() > 0;
    }

    public async Task<bool> UpdateAsync(T entity)
    {
        return await _db.Updateable(entity).ExecuteCommandAsync() > 0;
    }

    public async Task<bool> DeleteAsync(long id)
    {
        return await _db.Deleteable<T>().InAsync(id) > 0;
    }

    public ISugarQueryable<T> AsQueryable()
    {
        return _db.Queryable<T>();
    }
}

4.3 工作单元

public class UnitOfWork : IUnitOfWork
{
    private readonly ISqlSugarClient _db;

    public UnitOfWork(ISqlSugarClient db)
    {
        _db = db;
    }

    public async Task BeginTransactionAsync()
    {
        _db.Ado.BeginTran();
    }

    public async Task CommitTransactionAsync()
    {
        _db.Ado.CommitTran();
    }

    public async Task RollbackTransactionAsync()
    {
        _db.Ado.RollbackTran();
    }
}

4.4 使用示例

public class ArticleService
{
    private readonly IRepository<ArticleModel> _articleRepo;
    private readonly IUnitOfWork _unitOfWork;

    public async Task<bool> CreateArticleAsync(ArticleDto dto)
    {
        try
        {
            await _unitOfWork.BeginTransactionAsync();

            var article = new ArticleModel
            {
                Title = dto.Title,
                Content = dto.Content,
                CreateTime = DateTime.UtcNow
            };

            var result = await _articleRepo.InsertAsync(article);

            await _unitOfWork.CommitTransactionAsync();
            return result;
        }
        catch
        {
            await _unitOfWork.RollbackTransactionAsync();
            throw;
        }
    }
}

下一章将实现 JWT 认证与用户系统。

csharprepositoryunit-of-worksqlsugar