网站首页 网站源码
目前想设计成 数据仓储模式
IRepository
定义数据仓储的CURD定义包括有 同步 和 异步 的CURD方法
Repository
实现默认的数据仓储RepositoryUintOfWork
数据仓储的UnitOfWork(工作单元)模式Todo:目前UnitOfWork未实现 现已完全实现
UnitOfWork
部分实现
UnitOfWork
大部分实现
// 建议以 Transient 方式注入
services.AddTransient<IUnitOfWork, UnitOfWork>();
private class UnitOfWorkTestEntity : BaseEntity
{
public string Value { get; set; } = "";
}
private class UnitOfWorkTestEntity2 : BaseEntity
{
public string Value { get; set; } = "";
}
// 获取工作单元
using var uow = GetService<IUnitOfWork>();
// 获取 Repository ,如果获取相同类型的 Repository ,理论上是同一个对象
var repository1 = uow.GetRepository<UnitOfWorkTestEntity>();
var repository2 = uow.GetRepository<UnitOfWorkTestEntity2>();
// 工作单元开始
uow.Begin();
await repository1.DeleteAsync(x => true);
await repository2.DeleteAsync(x => true);
var entity1 = new UnitOfWorkTestEntity { Value = Guid.NewGuid().ToString("N") };
await repository1.InsertAsync(entity1);
var entity2 = new UnitOfWorkTestEntity2 { Value = Guid.NewGuid().ToString("N") };
await repository2.InsertAsync(entity2);
// 工作单元提交
await uow.CommitAsync();
// 获取一个新的工作单元 用于 rollback 测试
using var uow2 = GetService<IUnitOfWork>();
var repository3 = uow2.GetRepository<UnitOfWorkTestEntity>();
var repository4 = uow2.GetRepository<UnitOfWorkTestEntity2>();
var guid1 = Guid.NewGuid().ToString("N");
var guid2 = Guid.NewGuid().ToString("N");
try
{
var list1 = await repository3.SearchFor(x => true).ToListAsync();
Assert.IsNotNull(list1);
Assert.IsNotEmpty(list1);
var list2 = await repository4.SearchFor(x => true).ToListAsync();
Assert.IsNotNull(list2);
Assert.IsNotEmpty(list2);
uow2.Begin();
var entity3 = new UnitOfWorkTestEntity { Value = guid1 };
var entity4 = new UnitOfWorkTestEntity2 { Value = guid2 };
await repository3.InsertAsync(entity3);
await repository4.InsertAsync(entity4);
// mongodb 即使事务没有提交也可以查询到数据
var r1 = await repository3.SearchFor(x => x.Value == guid1).FirstOrDefaultAsync();
Assert.IsNotNull(r1);
var r2 = await repository4.SearchFor(x => x.Value == guid2).FirstOrDefaultAsync();
Assert.IsNotNull(r2);
throw new Exception();
}
catch (Exception)
{
await uow2.RollbackAsync();
}
var repo1 = new Repository<UnitOfWorkTestEntity>(ConnectionString);
var repo2 = new Repository<UnitOfWorkTestEntity2>(ConnectionString);
var result1 = await repo1.SearchFor(x => x.Value == guid1).FirstOrDefaultAsync();
Assert.IsNull(result1);
var result2 = await repo2.SearchFor(x => x.Value == guid2).FirstOrDefaultAsync();
Assert.IsNull(result2);