仓储(Repository)/工作单元(Unit Of Work)模式
一.实现基础的仓储接口
1. 创建 待办事项仓储接口类 IToDoRepository 并且定义了(ToDo)实体对数据库CURD 的方法
public interface IToDoRepository
{
Task<bool> Add(ToDo toDo);
bool Delete(ToDo toDo);
bool Update(ToDo toDo);
Task<ToDo> GetToDo();
}
2. 创建待办事项仓储的 实现类 ToDoRepository。该类继承自 IToDoRepository 仓储接口类,并且需要实现父类所有定义的方法。
public class ToDoRepository : IToDoRepository
{
private readonly MyToDoContext doContext;
public ToDoRepository(MyToDoContext doContext)
{
this.doContext = doContext;
}
public async Task<bool> Add(ToDo toDo)
{
await doContext.ToDo.AddAsync(toDo);
return await doContext.SaveChangesAsync()>0;
}
public bool Delete(ToDo toDo)
{
doContext.ToDo.Remove(toDo);
return doContext.SaveChanges()>0;
}
public bool Update(ToDo toDo)
{
doContext.ToDo.Update(new ToDo
{
Id = toDo.Id,
Title=toDo.Title,
Content=toDo.Content,
});
return doContext.SaveChanges()>0;
}
public async Task<ToDo> GetToDo()
{
var toDo=await doContext.ToDo.FirstOrDefaultAsync();
return toDo;
}
}
二.如何使用仓储
1. 在 Program.cs 中,进行注入
builder.Services.AddScoped<IToDoRepository,ToDoRepository>();

2. 在控制器构造函数中实例化定义的仓储接口,并且通过 toDoRepository 实例去调用到定义的方法。
namespace MyToDo.Api.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController : ControllerBase
{
private readonly IToDoRepository toDoRepository;
public WeatherForecastController(IToDoRepository toDoRepository)
{
this.toDoRepository = toDoRepository;
}
[HttpGet(Name = "GetToDo")]
public async Task<ToDo> Get()
{
var retsult= await toDoRepository.GetToDo();
return retsult;
}
[HttpPost(Name = "Add")]
public async Task<bool> AddAsync(ToDo toDo)
{
var retsult = await toDoRepository.Add(toDo);
return retsult;
}
[HttpDelete(Name = "Delete")]
public bool Deletes(ToDo toDo)
{
var retsult = toDoRepository.Delete(toDo);
return retsult;
}
[HttpPost(Name = "Update")]
public bool UpdateAsync(ToDo toDo)
{
var retsult = toDoRepository.Update(toDo);
return retsult;
}
}
}


三.工作单元 (Unit Of Work)
1. 下载 Unit Of Work 源码

2.在MyToDo.Api 项目中,创建一个 UnitOfWork 文件夹,并且把以下代码复制过来

3. 创建一个类库项目去存放,共用的代码

4.选择 类库项目,点下一步,并且项目名称定义成 :MyToDo.Shared

5.把共用的代码,复制到 MyToDo.Shared 里面去

6.在MyToDo.Api 项目中,右键=》添加=》项目引用

7.勾选 MyToDo.Shared。表示在 MyToDo.Api引用该项目,点击确定。

8.最后,还需要在MyToDo.Api 项目的NuGet 中下载安装这个包


四.如何使用工作单元 (Unit Of Work)
1. 先添加不同仓储的实现,例如,待办事项仓储 (ToDoRepository)
public class ToDoRepository : Repository<ToDo>, IRepository<ToDo>
{
public ToDoRepository(MyToDoContext dbContext) : base(dbContext)
{
}
}

2.在Program.cs 中进行依赖注入
builder.Services.AddDbContext<MyToDoContext>(option =>
{
var connectionString = builder.Configuration.GetConnectionString("ToDoConnection");
option.UseSqlite(connectionString);
}).AddUnitOfWork<MyToDoContext>()
.AddCustomRepository<ToDo,ToDoRepository>()
.AddCustomRepository<Memo, MemoRepository>()
.AddCustomRepository<User, UserRepository>();

3.使用方式
namespace MyToDo.Api.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController : ControllerBase
{
private readonly IUnitOfWork unitOfWork;
public WeatherForecastController(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
[HttpGet(Name = "GetToDo")]
public async Task<List<ToDo>> Get()
{
var service= unitOfWork.GetRepository<ToDo>();
return (List<ToDo>)await service.GetAllAsync();
}
}
}
4.最后效果
