Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(Aggregoot): Fix the problem that the aggregate root sends events in the wrong order #120

Merged
merged 4 commits into from
Jul 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions Masa.Contrib.sln
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Masa.Contrib.Ddd.Domain", "
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Masa.Contrib.Ddd.Domain.Repository.EF", "Masa.Contrib.Ddd.Domain.Repository.EF", "{880E8263-AECC-4793-BD28-7CD03650D124}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.Data.UoW.EF", "src\Data\Masa.Contrib.Data.UoW.EF\Masa.Contrib.Data.UoW.EF.csproj", "{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.Data.UoW.EF.Tests", "test\Masa.Contrib.Data.UoW.EF.Tests\Masa.Contrib.Data.UoW.EF.Tests.csproj", "{1B16DD58-0847-45A7-AF93-53EBFBEDAAE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.Configuration", "src\Configuration\Masa.Contrib.Configuration\Masa.Contrib.Configuration.csproj", "{C056C688-8FFC-42BC-B4EA-EF3808A8A12C}"
Expand Down Expand Up @@ -318,6 +316,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.BuildingBlocks.BasicAb
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.BasicAbility.Mc.Tests", "test\Masa.Contrib.BasicAbility.Mc.Tests\Masa.Contrib.BasicAbility.Mc.Tests.csproj", "{23633E49-F11A-4D14-899A-E2599C8182CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masa.Contrib.Data.UoW.EF", "src\Data\Masa.Contrib.Data.UoW.EF\Masa.Contrib.Data.UoW.EF.csproj", "{FC4E526A-DBFC-406A-8ED3-64983B67F688}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -470,14 +470,6 @@ Global
{761C3313-A669-465F-A384-9E118FCE4F89}.Release|Any CPU.Build.0 = Release|Any CPU
{761C3313-A669-465F-A384-9E118FCE4F89}.Release|x64.ActiveCfg = Release|Any CPU
{761C3313-A669-465F-A384-9E118FCE4F89}.Release|x64.Build.0 = Release|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Debug|x64.ActiveCfg = Debug|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Debug|x64.Build.0 = Debug|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Release|Any CPU.Build.0 = Release|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Release|x64.ActiveCfg = Release|Any CPU
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F}.Release|x64.Build.0 = Release|Any CPU
{1B16DD58-0847-45A7-AF93-53EBFBEDAAE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B16DD58-0847-45A7-AF93-53EBFBEDAAE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B16DD58-0847-45A7-AF93-53EBFBEDAAE7}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -1302,6 +1294,14 @@ Global
{4E237346-F948-46AC-801B-492545978280}.Release|Any CPU.Build.0 = Release|Any CPU
{4E237346-F948-46AC-801B-492545978280}.Release|x64.ActiveCfg = Release|Any CPU
{4E237346-F948-46AC-801B-492545978280}.Release|x64.Build.0 = Release|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Debug|x64.ActiveCfg = Debug|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Debug|x64.Build.0 = Debug|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Release|Any CPU.Build.0 = Release|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Release|x64.ActiveCfg = Release|Any CPU
{FC4E526A-DBFC-406A-8ED3-64983B67F688}.Release|x64.Build.0 = Release|Any CPU
{75A25CF6-9BA4-46F5-8BC3-90396230CB64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75A25CF6-9BA4-46F5-8BC3-90396230CB64}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75A25CF6-9BA4-46F5-8BC3-90396230CB64}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -1365,7 +1365,6 @@ Global
{761C3313-A669-465F-A384-9E118FCE4F89} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{13EDB361-AF88-4F89-B4AB-46622BCCBC37} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{880E8263-AECC-4793-BD28-7CD03650D124} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{1265AE3C-B5FD-4339-8A7D-BC598E6E1C9F} = {E33ADF54-4D35-49B7-BDA6-412587CA39FF}
{1B16DD58-0847-45A7-AF93-53EBFBEDAAE7} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{C056C688-8FFC-42BC-B4EA-EF3808A8A12C} = {59DA3D5F-9E39-4173-8C31-126967CC189F}
{428CDAF3-957A-4017-82EA-70737F205546} = {38E6C400-90C0-493E-9266-C1602E229F1B}
Expand Down Expand Up @@ -1480,6 +1479,7 @@ Global
{8D84666E-C79E-4D49-B73D-360E62D312EF} = {5DFAF4A2-ECB5-46E4-904D-1EA5F48B2D48}
{7C4B88FA-3681-4C29-BC3F-0FDB111C5681} = {FBD326D3-E59C-433E-A88E-14E179E3093D}
{592297DE-DA72-452D-9D88-61EE882FE9A6} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{FC4E526A-DBFC-406A-8ED3-64983B67F688} = {E33ADF54-4D35-49B7-BDA6-412587CA39FF}
{4E237346-F948-46AC-801B-492545978280} = {38E6C400-90C0-493E-9266-C1602E229F1B}
{75A25CF6-9BA4-46F5-8BC3-90396230CB64} = {5DFAF4A2-ECB5-46E4-904D-1EA5F48B2D48}
{DA816A33-F164-4456-92DD-A672BAD1A6B1} = {0D34A7F0-DC77-4789-A136-93089CBD15C3}
Expand Down
2 changes: 1 addition & 1 deletion src/BuildingBlocks/MASA.BuildingBlocks
Submodule MASA.BuildingBlocks updated 34 files
+1 −1 src/Authentication/Masa.BuildingBlocks.Authentication.Oidc.Domain/Entities/ApiResourceClaim.cs
+1 −1 src/Authentication/Masa.BuildingBlocks.Authentication.Oidc.Domain/Entities/ApiResourceScope.cs
+1 −1 src/Authentication/Masa.BuildingBlocks.Authentication.Oidc.Domain/Entities/ApiScopeClaim.cs
+1 −1 src/Authentication/Masa.BuildingBlocks.Authentication.Oidc.Domain/Entities/IdentityResourceClaim.cs
+1 −1 src/Authentication/Masa.BuildingBlocks.Authentication.Oidc.Models/Constans/StandardIdentityResources.cs
+5 −0 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth.Contracts/Model/AddressValueModel.cs
+6 −0 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth.Contracts/Model/TeamModel.cs
+19 −0 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth.Contracts/Model/UpdateUserBasicInfoModel.cs
+13 −0 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth.Contracts/Model/UpdateUserPasswordModel.cs
+1 −1 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth.Contracts/Model/UserModel.cs
+3 −1 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth/Service/ITeamService.cs
+6 −2 src/BasicAbility/Masa.BuildingBlocks.BasicAbility.Auth/Service/IUserService.cs
+7 −0 src/Data/Masa.BuildingBlocks.Data.UoW/IUnitOfWork.cs
+29 −0 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Events/DomainCommand.cs
+29 −0 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Events/DomainEvent.cs
+36 −0 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Events/DomainQuery.cs
+2 −0 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Events/IDomainEventBus.cs
+12 −0 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Events/IntegrationDomainEvent.cs
+19 −41 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/Repositories/BaseRepository.cs
+2 −3 src/Ddd/Masa.BuildingBlocks.Ddd.Domain/_Imports.cs
+26 −0 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.Events/Event.cs
+7 −1 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.Events/IMiddleware.cs
+11 −0 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.Events/Middleware.cs
+0 −1 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.Events/_Imports.cs
+32 −0 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.IntegrationEvents/IntegrationEvent.cs
+1 −0 src/Dispatcher/Masa.BuildingBlocks.Dispatcher.IntegrationEvents/_Imports.cs
+3 −1 src/Identity/Masa.BuildingBlocks.Identity.IdentityModel/Entities/IIdentityUser.cs
+11 −0 src/Identity/Masa.BuildingBlocks.Identity.IdentityModel/Entities/IdentityRole.cs
+3 −1 src/Identity/Masa.BuildingBlocks.Identity.IdentityModel/Entities/IdentityUser.cs
+3 −1 src/Identity/Masa.BuildingBlocks.Identity.IdentityModel/IUserContext.cs
+11 −0 src/Identity/Masa.BuildingBlocks.Identity.IdentityModel/UserContext.cs
+29 −0 src/ReadWriteSpliting/Masa.BuildingBlocks.ReadWriteSpliting.Cqrs/Commands/Command.cs
+29 −0 src/ReadWriteSpliting/Masa.BuildingBlocks.ReadWriteSpliting.Cqrs/Queries/Query.cs
+1 −0 src/ReadWriteSpliting/Masa.BuildingBlocks.ReadWriteSpliting.Cqrs/_Imports.cs
4 changes: 2 additions & 2 deletions src/Data/Masa.Contrib.Data.UoW.EF/Transaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace Masa.Contrib.Data.UoW.EF;

public class Transaction : ITransaction
{
public Transaction(IUnitOfWork unitOfWork) => UnitOfWork = unitOfWork;

[JsonIgnore]
public IUnitOfWork? UnitOfWork { get; set; }

public Transaction(IUnitOfWork unitOfWork) => UnitOfWork = unitOfWork;
}
34 changes: 27 additions & 7 deletions src/Data/Masa.Contrib.Data.UoW.EF/UnitOfWork.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,28 @@ public DbTransaction Transaction

public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
if (EntityState == EntityState.UnChanged)
return;

await Context.SaveChangesAsync(cancellationToken);
EntityState = EntityState.UnChanged;
}

public async Task CommitAsync(CancellationToken cancellationToken = default)
{
if (!UseTransaction || !TransactionHasBegun)
throw new NotSupportedException("Transaction not opened");
var domainEventBus = GetDomainEventBus();
while (domainEventBus != null && await domainEventBus.AnyQueueAsync())
{
await domainEventBus.PublishQueueAsync();

await Context.Database.CommitTransactionAsync(cancellationToken);
CommitState = CommitState.Commited;
await SaveChangesAsync(cancellationToken);
}

var domainEventBus = ServiceProvider.GetService<IDomainEventBus>();
if (domainEventBus != null)
await domainEventBus.PublishQueueAsync();
if (UseTransaction && TransactionHasBegun && CommitState == CommitState.UnCommited)
{
await Context.Database.CommitTransactionAsync(cancellationToken);
CommitState = CommitState.Commited;
}
}

public async Task RollbackAsync(CancellationToken cancellationToken = default)
Expand All @@ -64,7 +71,20 @@ public async Task RollbackAsync(CancellationToken cancellationToken = default)
await Context.Database.RollbackTransactionAsync(cancellationToken);
}

public Task AddDomainEventAsync<TDomainEvent>(TDomainEvent @event) where TDomainEvent : class
{
var domainEventBus = GetDomainEventBus();
if (domainEventBus == null || @event is not IDomainEvent domainEvent)
return Task.CompletedTask;

domainEventBus.Enqueue(domainEvent);
return Task.CompletedTask;
}

public async ValueTask DisposeAsync() => await (_context?.DisposeAsync() ?? ValueTask.CompletedTask);

public void Dispose() => _context?.Dispose();

private IDomainEventBus? GetDomainEventBus()
=> ServiceProvider.GetService<IDomainEventBus>();
}
40 changes: 1 addition & 39 deletions src/Ddd/Masa.Contrib.Ddd.Domain.Repository.EF/Repository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,6 @@ public Repository(TDbContext context, IUnitOfWork unitOfWork) : base(unitOfWork.
UnitOfWork = unitOfWork;
}

public override bool TransactionHasBegun
=> Context.Database.CurrentTransaction != null;

public override DbTransaction Transaction
{
get
{
if (!UseTransaction)
throw new NotSupportedException(nameof(Transaction));

if (TransactionHasBegun)
return Context.Database.CurrentTransaction!.GetDbTransaction();

return Context.Database.BeginTransaction().GetDbTransaction();
}
}

public override bool UseTransaction
{
get => UnitOfWork.UseTransaction;
set => UnitOfWork.UseTransaction = value;
}

public override IUnitOfWork UnitOfWork { get; }

public override EntityState EntityState
Expand Down Expand Up @@ -69,13 +46,6 @@ public override async Task AddRangeAsync(
EntityState = EntityState.Changed;
}

public override Task CommitAsync(CancellationToken cancellationToken = default)
=> UnitOfWork.CommitAsync(cancellationToken);

public override async ValueTask DisposeAsync() => await Context.DisposeAsync();

public override void Dispose() => Context.Dispose();

public override Task<TEntity?> FindAsync(
IEnumerable<KeyValuePair<string, object>> keyValues,
CancellationToken cancellationToken = default)
Expand Down Expand Up @@ -205,14 +175,6 @@ public override Task RemoveRangeAsync(IEnumerable<TEntity> entities, Cancellatio
return Task.CompletedTask;
}

public override Task RollbackAsync(CancellationToken cancellationToken = default)
=> UnitOfWork.RollbackAsync(cancellationToken);

public override async Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
await UnitOfWork.SaveChangesAsync(cancellationToken);
}

public override Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default)
{
Context.Set<TEntity>().Update(entity);
Expand Down Expand Up @@ -245,7 +207,7 @@ private void CheckAndOpenTransaction()

public class Repository<TDbContext, TEntity, TKey> :
Repository<TDbContext, TEntity>,
IRepository<TEntity, TKey>, IUnitOfWork
IRepository<TEntity, TKey>
where TEntity : class, IEntity<TKey>
where TDbContext : DbContext
where TKey : IComparable
Expand Down
5 changes: 5 additions & 0 deletions src/Ddd/Masa.Contrib.Ddd.Domain/DomainEventBus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public async Task PublishQueueAsync()
}
}

public Task<bool> AnyQueueAsync()
{
return Task.FromResult(_eventQueue.Count > 0);
}

public async Task CommitAsync(CancellationToken cancellationToken = default)
=> await _unitOfWork.CommitAsync(cancellationToken);

Expand Down
8 changes: 4 additions & 4 deletions src/Dispatcher/Masa.Contrib.Dispatcher.Events/EventBus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public async Task PublishAsync<TEvent>(TEvent @event) where TEvent : IEvent

if (_options.UnitOfWorkRelation[eventType])
{
ITransaction transactionEvent = (ITransaction) @event;
ITransaction transactionEvent = (ITransaction)@event;
var unitOfWork = _serviceProvider.GetService<IUnitOfWork>();
if (unitOfWork != null)
{
Expand All @@ -46,13 +46,13 @@ public async Task PublishAsync<TEvent>(TEvent @event) where TEvent : IEvent
}
else
{
middlewares = middlewares.Where(middleware => middleware is not TransactionMiddleware<TEvent>);
middlewares = middlewares.Where(middleware => middleware.SupportRecursive);
}
}
}

EventHandlerDelegate publishEvent = async () => { await _dispatcher.PublishEventAsync(_serviceProvider, @event); };
await middlewares.Reverse().Aggregate(publishEvent, (next, middleware) => () => middleware.HandleAsync(@event, next))();
EventHandlerDelegate eventHandlerDelegate = async () => { await _dispatcher.PublishEventAsync(_serviceProvider, @event); };
await middlewares.Reverse().Aggregate(eventHandlerDelegate, (next, middleware) => () => middleware.HandleAsync(@event, next))();
}

public IEnumerable<Type> GetAllEventTypes() => _options.AllEventTypes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,50 +3,38 @@

namespace Masa.Contrib.Dispatcher.Events.Internal.Middleware;

public class TransactionMiddleware<TEvent> : IMiddleware<TEvent>
where TEvent : notnull, IEvent
internal class TransactionMiddleware<TEvent> : Middleware<TEvent>
where TEvent : IEvent
{
private readonly IUnitOfWork? _unitOfWork;

public override bool SupportRecursive => false;

public TransactionMiddleware(IUnitOfWork? unitOfWork = null)
{
_unitOfWork = unitOfWork;
}

public async Task HandleAsync(TEvent @event, EventHandlerDelegate next)
public override async Task HandleAsync(TEvent @event, EventHandlerDelegate next)
{
try
{
await next();

if (_unitOfWork is { EntityState: EntityState.Changed })
if (_unitOfWork != null)
{
await _unitOfWork.SaveChangesAsync();
}
if (IsUseTransaction(@event, out ITransaction? transaction))
{
await transaction!.UnitOfWork!.CommitAsync();
await _unitOfWork.CommitAsync();
}
}
catch (Exception)
{
if (IsUseTransaction(@event, out ITransaction? transaction) && !transaction!.UnitOfWork!.DisableRollbackOnFailure)
if (_unitOfWork is { DisableRollbackOnFailure: false })
{
await transaction.UnitOfWork!.RollbackAsync();
await _unitOfWork!.RollbackAsync();
}
throw;
}
}

private bool IsUseTransaction(TEvent @event, out ITransaction? transaction)
{
if (@event is ITransaction { UnitOfWork: { UseTransaction: true, TransactionHasBegun: true, CommitState: CommitState.UnCommited } } transactionEvent)
{
transaction = transactionEvent;
return true;
throw;
}

transaction = null;
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@
global using Masa.Contrib.Dispatcher.IntegrationEvents.Dapr.Options;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.DependencyInjection.Extensions;
global using Microsoft.Extensions.Options;
global using System.Reflection;
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Masa.Contrib.Isolation.Middleware;

public class IsolationMiddleware<TEvent> : IMiddleware<TEvent> where TEvent : IEvent
public class IsolationMiddleware<TEvent> : Middleware<TEvent> where TEvent : IEvent
{
private readonly IEnumerable<IIsolationMiddleware> _middlewares;

Expand All @@ -12,7 +12,7 @@ public IsolationMiddleware(IEnumerable<IIsolationMiddleware> middlewares)
_middlewares = middlewares;
}

public async Task HandleAsync(TEvent @event, EventHandlerDelegate next)
public override async Task HandleAsync(TEvent @event, EventHandlerDelegate next)
{
foreach (var middleware in _middlewares)
{
Expand Down
Loading