网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
csharp
csharp
csharp
csharp
readme
csharp
csharp
csharp

数据库交互程序集

目前想设计成 数据仓储模式

IRepository 定义数据仓储的CURD

定义包括有 同步异步 的CURD方法

Repository 实现默认的数据仓储

RepositoryUintOfWork 数据仓储的UnitOfWork(工作单元)模式

Todo:目前UnitOfWork未实现 现已完全实现

2019年12月9日:

UnitOfWork 部分实现

2019年12月20日:

UnitOfWork 大部分实现

关于单实例Mongodb不支持事务的解决办法

使用方式:

// 建议以 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);


loading