From 903a309c92e7006924d04c6b27e2e2afdbe4e8c9 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 18 Sep 2022 22:22:26 +0800 Subject: [PATCH] update demo --- .../Domain/SongRepository.cs | 35 +++++++++++ Examples/aspnetcore_transaction/Program.cs | 1 - .../Properties/launchSettings.json | 27 --------- .../Services/SongService.cs | 57 ++++++++++++++++++ Examples/aspnetcore_transaction/Startup.cs | 7 ++- .../TransactionalAttribute02.cs | 54 ----------------- .../aspnetcore_transaction.csproj | 9 +-- .../aspnetcore_transaction.xml | 5 ++ .../aspnetcore经典示范.zip | Bin 0 -> 7248 bytes FreeSql-lite.sln | 19 +++++- 10 files changed, 122 insertions(+), 92 deletions(-) create mode 100644 Examples/aspnetcore_transaction/Domain/SongRepository.cs delete mode 100644 Examples/aspnetcore_transaction/Properties/launchSettings.json create mode 100644 Examples/aspnetcore_transaction/Services/SongService.cs delete mode 100644 Examples/aspnetcore_transaction/TransactionalAttribute02.cs create mode 100644 Examples/aspnetcore_transaction/aspnetcore经典示范.zip diff --git a/Examples/aspnetcore_transaction/Domain/SongRepository.cs b/Examples/aspnetcore_transaction/Domain/SongRepository.cs new file mode 100644 index 00000000..352dd6b7 --- /dev/null +++ b/Examples/aspnetcore_transaction/Domain/SongRepository.cs @@ -0,0 +1,35 @@ +using System; +using System.ComponentModel; +using System.Threading.Tasks; +using FreeSql; +using FreeSql.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace aspnetcore_transaction.Domain +{ + public class SongRepository : DefaultRepository + { + public SongRepository(UnitOfWorkManager uowm) : base(uowm?.Orm, uowm) { } + } + + [Description("123")] + public class Song + { + /// + /// 自增 + /// + [Column(IsIdentity = true)] + [Description("自增id")] + public int Id { get; set; } + public string Title { get; set; } + } + public class Detail + { + [Column(IsIdentity = true)] + public int Id { get; set; } + + public int SongId { get; set; } + public string Title { get; set; } + } +} diff --git a/Examples/aspnetcore_transaction/Program.cs b/Examples/aspnetcore_transaction/Program.cs index 7d61ff83..282417ed 100644 --- a/Examples/aspnetcore_transaction/Program.cs +++ b/Examples/aspnetcore_transaction/Program.cs @@ -16,7 +16,6 @@ namespace aspnetcore_transaction { webBuilder.UseStartup(); }) - //.UseServiceProviderFactory(new FreeSql.DynamicProxyServiceProviderFactory()) ; } } diff --git a/Examples/aspnetcore_transaction/Properties/launchSettings.json b/Examples/aspnetcore_transaction/Properties/launchSettings.json deleted file mode 100644 index df5dd806..00000000 --- a/Examples/aspnetcore_transaction/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:64513/", - "sslPort": 44328 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "dbcontext_01": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:35351/" - } - } -} \ No newline at end of file diff --git a/Examples/aspnetcore_transaction/Services/SongService.cs b/Examples/aspnetcore_transaction/Services/SongService.cs new file mode 100644 index 00000000..6e1d4275 --- /dev/null +++ b/Examples/aspnetcore_transaction/Services/SongService.cs @@ -0,0 +1,57 @@ +using System; +using System.ComponentModel; +using System.Threading.Tasks; +using aspnetcore_transaction.Domain; +using FreeSql; +using FreeSql.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace aspnetcore_transaction.Services +{ + public class SongService + { + BaseRepository _repoSong; + BaseRepository _repoDetail; + SongRepository _repoSong2; + + public SongService(BaseRepository repoSong, BaseRepository repoDetail, SongRepository repoSong2) + { + var tb = repoSong.Orm.CodeFirst.GetTableByEntity(typeof(Song)); + _repoSong = repoSong; + _repoDetail = repoDetail; + _repoSong2 = repoSong2; + } + + [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 + public void Test1() + { + _repoSong.Insert(new Song()); + _repoDetail.Insert(new Detail()); + _repoSong2.Insert(new Song()); + } + [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 + public Task Test11() + { + return Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(t => + _repoSong.InsertAsync(new Song())); + } + + [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 + public async Task Test2() + { + await _repoSong.InsertAsync(new Song()); + await _repoDetail.InsertAsync(new Detail()); + await _repoSong2.InsertAsync(new Song()); + } + + [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 + public async Task Test3() + { + await _repoSong.InsertAsync(new Song()); + await _repoDetail.InsertAsync(new Detail()); + await _repoSong2.InsertAsync(new Song()); + return "123"; + } + } +} diff --git a/Examples/aspnetcore_transaction/Startup.cs b/Examples/aspnetcore_transaction/Startup.cs index bbaffcd1..9744693e 100644 --- a/Examples/aspnetcore_transaction/Startup.cs +++ b/Examples/aspnetcore_transaction/Startup.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Linq; using System.Text; using aspnetcore_transaction.Controllers; using FreeSql; @@ -35,7 +36,11 @@ namespace aspnetcore_transaction services.AddSingleton(Fsql); services.AddScoped(); - services.AddFreeRepository(null, typeof(Startup).Assembly); + + //批量注入 + foreach (var repo in typeof(Startup).Assembly.GetTypes() + .Where(a => a.IsAbstract == false && typeof(IBaseRepository).IsAssignableFrom(a))) + services.AddScoped(repo); services.AddScoped(); } diff --git a/Examples/aspnetcore_transaction/TransactionalAttribute02.cs b/Examples/aspnetcore_transaction/TransactionalAttribute02.cs deleted file mode 100644 index fb4629ee..00000000 --- a/Examples/aspnetcore_transaction/TransactionalAttribute02.cs +++ /dev/null @@ -1,54 +0,0 @@ -//using FreeSql; -//using Microsoft.AspNetCore.Mvc.Filters; -//using System; -//using System.Collections.Generic; -//using System.Data; -//using System.Text; -//using System.Threading.Tasks; - -//namespace FreeSql -//{ -// /// -// /// 使用事务执行,请查看 Program.cs 代码开启动态代理 -// /// -// [AttributeUsage(AttributeTargets.Method)] -// public class TransactionalAttribute : DynamicProxyAttribute, IActionFilter -// { -// public Propagation Propagation { get; set; } = Propagation.Required; -// public IsolationLevel IsolationLevel { get => _IsolationLevelPriv.Value; set => _IsolationLevelPriv = value; } -// IsolationLevel? _IsolationLevelPriv; - -// [DynamicProxyFromServices] -//#pragma warning disable IDE0044 // 添加只读修饰符 -// UnitOfWorkManager _uowManager; -//#pragma warning restore IDE0044 // 添加只读修饰符 -// IUnitOfWork _uow; - -// public override Task Before(DynamicProxyBeforeArguments args) => OnBefore(_uowManager); -// public override Task After(DynamicProxyAfterArguments args) => OnAfter(args.Exception); - -// //这里是为了 controller -// public void OnActionExecuting(ActionExecutingContext context) => OnBefore(context.HttpContext.RequestServices.GetService(typeof(UnitOfWorkManager)) as UnitOfWorkManager); -// public void OnActionExecuted(ActionExecutedContext context) => OnAfter(context.Exception); - - -// Task OnBefore(UnitOfWorkManager uowm) -// { -// _uow = uowm.Begin(this.Propagation, this._IsolationLevelPriv); -// return Task.FromResult(false); -// } -// Task OnAfter(Exception ex) -// { -// try -// { -// if (ex == null) _uow.Commit(); -// else _uow.Rollback(); -// } -// finally -// { -// _uow.Dispose(); -// } -// return Task.FromResult(false); -// } -// } -//} diff --git a/Examples/aspnetcore_transaction/aspnetcore_transaction.csproj b/Examples/aspnetcore_transaction/aspnetcore_transaction.csproj index 32a8331c..af2fe669 100644 --- a/Examples/aspnetcore_transaction/aspnetcore_transaction.csproj +++ b/Examples/aspnetcore_transaction/aspnetcore_transaction.csproj @@ -11,15 +11,10 @@ + + - - - - - - - diff --git a/Examples/aspnetcore_transaction/aspnetcore_transaction.xml b/Examples/aspnetcore_transaction/aspnetcore_transaction.xml index d301a332..9ec825a1 100644 --- a/Examples/aspnetcore_transaction/aspnetcore_transaction.xml +++ b/Examples/aspnetcore_transaction/aspnetcore_transaction.xml @@ -9,5 +9,10 @@ 自增 + + + 自增 + + diff --git a/Examples/aspnetcore_transaction/aspnetcore经典示范.zip b/Examples/aspnetcore_transaction/aspnetcore经典示范.zip new file mode 100644 index 0000000000000000000000000000000000000000..d7f302ae323dddf257bca75225bf3b876c3167c9 GIT binary patch literal 7248 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