diff --git a/README.md b/README.md index 19e516b6..31891655 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,11 @@ WebFirst开发:所有代码生成器已经配置完成,无需任何操作数 没了,恭喜你已经成功完成了项目,并且已经具备大部分通用场景业务 是不是一个字?爽! 到此为止,你无需写任何一个代码! + +**爽点**: + +新人,看这里,项目下载之后直接可以启动,无任何依赖,之后你可以查看`Test控制器`,迫不及待的快来爽一爽! + 我们将使用说明转移至我们的官方论坛中,正在制作中,尽情期待! **** diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml index ba2472e8..a8755344 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml @@ -75,5 +75,11 @@ + + + 异步事务测试 + + + diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs index a1fb5093..0cd9394d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs @@ -23,7 +23,8 @@ namespace Yi.Framework.ApiMicroservice.Controllers { private IStringLocalizer _local; private IUserService _iUserService; - public TestController(ILogger logger, IUserService iUserService, IStringLocalizer local) + //你可以依赖注入服务层各各接口,也可以注入其他仓储层,怎么爽怎么来! + public TestController(ILogger logger, IUserService iUserService, IStringLocalizer local) { _local = local; _iUserService = iUserService; @@ -34,9 +35,28 @@ namespace Yi.Framework.ApiMicroservice.Controllers /// /// [HttpGet] - /// 特点:仓储代理上下文对象,用起来就是爽 + // 特点:化繁为简!意框架仓储代理上下文对象,用起来就是爽,但最好按规范来爽! + // 规范:控制器建议不要使用切换仓储方法,控制器严禁使用DB上下文对象,其它怎么爽怎么来! public async Task DbTest() { + //非常好,使用UserService的特有方法 + await _iUserService.DbTest(); + + //非常好,依赖注入使用其他Service的特有方法(就tm一张表,自己注入自己) + await _iUserService.DbTest(); + + //很核理,使用仓储的通用方法 + await _iUserService._repository.GetListAsync(); + + //挺不错,依赖注入其他仓储(就tm一张表,自己注入自己) + await _iUserService._repository.GetListAsync(); + + //不建议,但爽了再说,直接切换其他仓储(就tm一张表,自己切换自己) + await _iUserService._repository.ChangeRepository>().GetListAsync(); + + //恭喜你已经毕业了!此后将有一天,接手到这个的软件的程序员将破口大骂。 + await _iUserService._repository._Db.Queryable().ToListAsync(); + return Result.Success().SetData(await _iUserService.DbTest()); } @@ -45,6 +65,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers /// /// [HttpGet] + //根据浏览器语言设置来切换输出 public Result LocalTest() { return Result.Success().SetData(_local["succeed"]); @@ -71,5 +92,35 @@ namespace Yi.Framework.ApiMicroservice.Controllers { return Result.Success(); } + + /// + /// 异步事务测试 + /// + /// + [HttpGet] + //注册一个用户获取它的信息之后再更新它,但是这个年龄可能会报错 + //如果一个事务中有任何一个错误,将会把所有执行过的操作进行回滚,确保数据的原子性 + public async Task TranTest() + { + UserEntity user = new() { UserName = $"杰哥{DateTime.Now}", Password = "5201314", Age = 99 }; + + var res = await _iUserService._repository.UseTranAsync(async () => + { + await _iUserService.Register(user, (o) => user = o); + user.Age = 18 / (new Random().Next(0, 2)); + await _iUserService._repository.UpdateAsync(user); + }); + if (res) + { + return Result.Success("执行成功!"); + } + else + { + return Result.Error("发生错误,插入已回滚!"); + } + + } + + //emmmm,看来一张表已经满足不了,接下来将要大更新一波 } } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index 8f490588..b16cd971 100644 Binary files a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db and b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db differ diff --git a/Yi.Framework.Net6/Yi.Framework.Repository/IRepository.cs b/Yi.Framework.Net6/Yi.Framework.Repository/IRepository.cs index 1bca4848..03494b5c 100644 --- a/Yi.Framework.Net6/Yi.Framework.Repository/IRepository.cs +++ b/Yi.Framework.Net6/Yi.Framework.Repository/IRepository.cs @@ -14,6 +14,7 @@ namespace Yi.Framework.Repository public interface IRepository : ISimpleClient where T : BaseModelEntity,new() { public ISqlSugarClient _Db { get; set; } + public Task UseTranAsync(Func func); public Task InsertReturnEntityAsync(T entity); public Task> StoreAsync(string storeName, object para); public Task>> CommonPageAsync(QueryPageCondition pars); diff --git a/Yi.Framework.Net6/Yi.Framework.Repository/Repository.cs b/Yi.Framework.Net6/Yi.Framework.Repository/Repository.cs index 46efea88..58775d25 100644 --- a/Yi.Framework.Net6/Yi.Framework.Repository/Repository.cs +++ b/Yi.Framework.Net6/Yi.Framework.Repository/Repository.cs @@ -24,6 +24,18 @@ namespace Yi.Framework.Repository _Db = context; } + /// + /// 异步事务 + /// + /// + /// + public async Task UseTranAsync(Func func) + { + var res = await Db.AsTenant().UseTranAsync(func); + return res.IsSuccess; + + } + /// /// 添加返回实体