diff --git a/samples/apis/Backet.Api/Controllers/BacketController.cs b/samples/apis/Backet.Api/Controllers/BacketController.cs index 1cf72c1..0bc65ea 100644 --- a/samples/apis/Backet.Api/Controllers/BacketController.cs +++ b/samples/apis/Backet.Api/Controllers/BacketController.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Runtime; using System.Text; using System.Threading.Tasks; using Backet.Api.Domain.Event; @@ -12,6 +13,7 @@ using Dapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Npgsql; using Orleans; @@ -20,6 +22,7 @@ using Pole.Core.EventBus.Event; using Pole.Core.EventBus.EventHandler; using Pole.Core.EventBus.EventStorage; using Pole.Core.Serialization; +using Pole.Core.UnitOfWork; using Pole.Core.Utils.Abstraction; namespace Backet.Api.Controllers @@ -35,8 +38,9 @@ namespace Backet.Api.Controllers private readonly ISerializer serializer; private readonly ISnowflakeIdGenerator snowflakeIdGenerator; private readonly IEventBuffer eventBuffer; + private readonly IServiceProvider serviceProvider; public BacketController(IClusterClient clusterClient, ILogger logger, IProducerInfoContainer producerContainer, - IEventTypeFinder eventTypeFinder, ISerializer serializer, ISnowflakeIdGenerator snowflakeIdGenerator, IEventBuffer eventBuffer) + IEventTypeFinder eventTypeFinder, ISerializer serializer, ISnowflakeIdGenerator snowflakeIdGenerator, IEventBuffer eventBuffer, IServiceProvider serviceProvider) { this.clusterClient = clusterClient; this.logger = logger; @@ -45,18 +49,43 @@ namespace Backet.Api.Controllers this.serializer = serializer; this.snowflakeIdGenerator = snowflakeIdGenerator; this.eventBuffer = eventBuffer; + this.serviceProvider = serviceProvider; } [HttpPost("api/backet/AddBacket")] - public Task AddBacket([FromBody]Backet.Api.Grains.Abstraction.BacketDto backet) + public Task AddBacket([FromBody]Backet.Api.Grains.Abstraction.BacketDto backetDto) { var newId = Guid.NewGuid().ToString("N").ToLower(); - backet.Id = newId; + backetDto.Id = newId; var grain = clusterClient.GetGrain(newId); - return grain.AddBacket(backet); + //var unitOfWork = serviceProvider.GetRequiredService(); + //var dbContext = serviceProvider.GetRequiredService(); + //var bus = serviceProvider.GetRequiredService(); + //using (var transaction = await dbContext.Database.BeginTransactionAsync()) + //{ + // unitOfWork.Enlist(transaction, bus); + // Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet backet = new Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet + // { + // Id = backetDto.Id, + // UserId = backetDto.UserId + // }; + // if (backetDto.BacketItems == null || backetDto.BacketItems.Count == 0) return false; + // backetDto.BacketItems.ForEach(item => + // { + // backet.AddBacketItem(item.ProductId, item.ProductName, item.Price); + // }); + // dbContext.Backets.Add(backet); + // await bus.Publish(new BacketCreatedEvent() { BacketId = backet.Id }); + // await unitOfWork.CompeleteAsync(); + //} + //return true; + + return grain.AddBacket(backetDto); } [HttpPost("api/backet/UpdateBacket")] public Task UpdateBacket() { + GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.Default; + System.GC.Collect(); var id = "67bbf594246441a18d7b6c74a277d06a"; var grain = clusterClient.GetGrain(id); return grain.UpdateBacket("99"); diff --git a/samples/apis/Backet.Api/Grains/AddBacketGrain.cs b/samples/apis/Backet.Api/Grains/AddBacketGrain.cs index 6f73eba..ff82a9f 100644 --- a/samples/apis/Backet.Api/Grains/AddBacketGrain.cs +++ b/samples/apis/Backet.Api/Grains/AddBacketGrain.cs @@ -20,13 +20,11 @@ namespace Backet.Api.Grains using (var scope = ServiceProvider.CreateScope()) { var unitOfWork = scope.ServiceProvider.GetRequiredService(); - var dbTransactionAdapter = scope.ServiceProvider.GetRequiredService(); var dbContext = scope.ServiceProvider.GetRequiredService(); var bus = scope.ServiceProvider.GetRequiredService(); using (var transaction = await dbContext.Database.BeginTransactionAsync()) { - dbTransactionAdapter.DbTransaction = transaction; - unitOfWork.Enlist(dbTransactionAdapter, bus); + unitOfWork.Enlist(transaction, bus); Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet backet = new Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet { Id = backetDto.Id, @@ -43,7 +41,6 @@ namespace Backet.Api.Grains } return true; } - } } } diff --git a/samples/apis/Backet.Api/Grains/BacketGrain.cs b/samples/apis/Backet.Api/Grains/BacketGrain.cs index 42b5aae..8a12dc5 100644 --- a/samples/apis/Backet.Api/Grains/BacketGrain.cs +++ b/samples/apis/Backet.Api/Grains/BacketGrain.cs @@ -14,22 +14,22 @@ namespace Backet.Api.Grains { public async Task AddBacket(BacketDto backetDto) { - - if (State != null) return false; - Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet backet = new Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet - { - Id = backetDto.Id, - UserId = backetDto.UserId - }; - if (backetDto.BacketItems == null || backetDto.BacketItems.Count == 0) return false; - backetDto.BacketItems.ForEach(item => - { - backet.AddBacketItem(item.ProductId, item.ProductName, item.Price); - }); - Add(backet); - backet.AddDomainEvent(new BacketCreatedEvent() { BacketId = backet.Id }); - await WriteStateAsync(); + //if (State != null) return false; + + //Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet backet = new Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet + //{ + // Id = backetDto.Id, + // UserId = backetDto.UserId + //}; + //if (backetDto.BacketItems == null || backetDto.BacketItems.Count == 0) return false; + //backetDto.BacketItems.ForEach(item => + //{ + // backet.AddBacketItem(item.ProductId, item.ProductName, item.Price); + //}); + //Add(backet); + //backet.AddDomainEvent(new BacketCreatedEvent() { BacketId = backet.Id }); + //await WriteStateAsync(); return true; } diff --git a/samples/apis/Backet.Api/Program.cs b/samples/apis/Backet.Api/Program.cs index 1ca150e..1cccc5b 100644 --- a/samples/apis/Backet.Api/Program.cs +++ b/samples/apis/Backet.Api/Program.cs @@ -10,6 +10,7 @@ using Orleans; using Orleans.Hosting; using Pole.Orleans.Provider.EntityframeworkCore; using Microsoft.Extensions.Logging; +using Orleans.Configuration; namespace Backet.Api { @@ -26,18 +27,14 @@ namespace Backet.Api { siloBuilder.UseLocalhostClustering(); siloBuilder.AddEfGrainStorage("ef"); + siloBuilder.Configure(options => + { + options.CollectionAge = TimeSpan.FromMinutes(2); + }); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); - }) - .ConfigureLogging((hostingContext, logging) => - { - // The ILoggingBuilder minimum level determines the - // the lowest possible level for logging. The log4net - // level then sets the level that we actually log at. - logging.AddLog4Net(); - logging.SetMinimumLevel(LogLevel.Warning); - }); + }); } } diff --git a/src/Pole.Core/UnitOfWork/IUnitOfWork.cs b/src/Pole.Core/UnitOfWork/IUnitOfWork.cs index 7664276..27910ab 100644 --- a/src/Pole.Core/UnitOfWork/IUnitOfWork.cs +++ b/src/Pole.Core/UnitOfWork/IUnitOfWork.cs @@ -15,5 +15,6 @@ namespace Pole.Core.UnitOfWork Task CompeleteAsync(CancellationToken cancellationToken = default); Task Rollback(CancellationToken cancellationToken = default); IUnitOfWork Enlist(IDbTransactionAdapter dbTransactionAdapter, IBus bus); + IServiceProvider ServiceProvider { get; } } } diff --git a/src/Pole.Core/UnitOfWork/UnitOfWork.cs b/src/Pole.Core/UnitOfWork/UnitOfWork.cs index b4e7ba1..035441a 100644 --- a/src/Pole.Core/UnitOfWork/UnitOfWork.cs +++ b/src/Pole.Core/UnitOfWork/UnitOfWork.cs @@ -24,13 +24,15 @@ namespace Pole.Core.UnitOfWork private readonly ISerializer serializer; private IBus bus; private IEventBuffer eventBuffer; + public IServiceProvider ServiceProvider { get; } public UnitOfWork(IProducerInfoContainer producerContainer, IEventTypeFinder eventTypeFinder, - ISerializer serializer, IEventBuffer eventBuffer) + ISerializer serializer, IEventBuffer eventBuffer, IServiceProvider serviceProvider) { this.producerContainer = producerContainer; this.eventTypeFinder = eventTypeFinder; this.serializer = serializer; this.eventBuffer = eventBuffer; + this.ServiceProvider = serviceProvider; } public async Task CompeleteAsync(CancellationToken cancellationToken = default) diff --git a/src/Pole.EventStorage.PostgreSql/IUnitOfWorkExtensions.cs b/src/Pole.EventStorage.PostgreSql/IUnitOfWorkExtensions.cs new file mode 100644 index 0000000..a7dba92 --- /dev/null +++ b/src/Pole.EventStorage.PostgreSql/IUnitOfWorkExtensions.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; +using Pole.Core.EventBus; +using Pole.Core.EventBus.Transaction; +using Pole.Core.UnitOfWork; +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; + +namespace Pole.Core.UnitOfWork +{ + public static class IUnitOfWorkExtensions + { + public static IUnitOfWork Enlist(this IUnitOfWork unitOfWork, IDbContextTransaction dbContextTransaction, IBus bus) + { + var dbTransactionAdapter = unitOfWork.ServiceProvider.GetRequiredService(); + dbTransactionAdapter.DbTransaction = dbContextTransaction; + unitOfWork.Enlist(dbTransactionAdapter, bus); + return unitOfWork; + } + public static IUnitOfWork Enlist(this IUnitOfWork unitOfWork, IDbTransaction dbTransaction, IBus bus) + { + var dbTransactionAdapter = unitOfWork.ServiceProvider.GetRequiredService(); + dbTransactionAdapter.DbTransaction = dbTransaction; + unitOfWork.Enlist(dbTransactionAdapter, bus); + return unitOfWork; + } + } +}