From f5ba3fecdf0aece4b467014eb5caff4bc6ac94c7 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sun, 23 Nov 2025 09:06:29 +0000 Subject: [PATCH 01/41] - checkin - initial v1.0.0 --- .../Aggregates/AccountAggregate.cs | 37 +- .../Aggregates/BankAccount.cs | 2 - .../Aggregates/IAccountAggregate.cs | 14 + .../Commands/ActivateAccount.cs | 3 +- .../Commands/CloseAccount.cs | 3 +- .../Commands/CreateAccount.cs | 4 +- .../Commands/DepositMoney.cs | 3 +- src/SourceFlow.ConsoleApp/Commands/Payload.cs | 6 +- .../Commands/WithdrawMoney.cs | 3 +- .../Events/AccountCreated.cs | 2 +- .../Events/AccountUpdated.cs | 2 +- .../Impl/InMemoryCommandStore.cs | 17 +- .../Impl/InMemoryRepository.cs | 6 +- .../Impl/InMemoryViewProvider.cs | 5 +- src/SourceFlow.ConsoleApp/Program.cs | 79 ++- .../Projections/AccountView.cs | 5 +- .../Sagas/AccountSaga.cs | 93 ++- .../Services/AccountService.cs | 78 --- .../Services/IAccountService.cs | 15 - src/SourceFlow/Aggregate/Aggregate.cs | 33 +- .../EventSubscriber.cs} | 38 +- src/SourceFlow/Aggregate/ISubscribes.cs | 2 +- src/SourceFlow/ClassDiagram.cd | 371 ----------- src/SourceFlow/ICommandStore.cs | 2 +- src/SourceFlow/{Aggregate => }/IEntity.cs | 2 +- src/SourceFlow/IRepository.cs | 1 - src/SourceFlow/Impl/CommandReplayer.cs | 35 - src/SourceFlow/IocExtensions.cs | 607 +++++------------- src/SourceFlow/Messaging/Bus/ICommandBus.cs | 6 +- .../Messaging/Bus/ICommandDispatcher.cs | 20 - .../Messaging/Bus/ICommandReplayer.cs | 17 - .../Messaging/Bus/IEventDispatcher.cs | 7 - .../{ => Messaging/Bus}/Impl/CommandBus.cs | 25 +- .../Messaging/{ => Commands}/Command.cs | 28 +- src/SourceFlow/Messaging/Commands/ICommand.cs | 26 + .../Messaging/Commands/ICommandDispatcher.cs | 14 + .../{Bus => Commands}/ICommandPublisher.cs | 8 +- .../Messaging/Commands/ICommandSubscriber.cs | 26 + .../Commands/Impl/CommandDispatcher.cs | 69 ++ .../Commands}/Impl/CommandPublisher.cs | 19 +- .../Messaging/{ => Events}/Event.cs | 12 +- .../Messaging/{ => Events}/IEvent.cs | 4 +- .../Messaging/Events/IEventDispatcher.cs | 9 + .../Messaging/{Bus => Events}/IEventQueue.cs | 7 +- .../Messaging/Events/IEventSubscriber.cs | 18 + .../Messaging/Events/Impl/EventDispatcher.cs | 57 ++ .../{ => Messaging/Events}/Impl/EventQueue.cs | 15 +- src/SourceFlow/Messaging/ICommand.cs | 13 - src/SourceFlow/Messaging/IPayload.cs | 5 +- .../EventSubscriber.cs} | 34 +- src/SourceFlow/Projections/IProjection.cs | 2 +- .../CommandSubscriber.cs} | 49 +- src/SourceFlow/Saga/IHandles.cs | 8 +- src/SourceFlow/Saga/IHandlesWithEvent.cs | 17 + src/SourceFlow/Saga/ISaga.cs | 3 +- src/SourceFlow/Saga/Saga.cs | 120 +++- src/SourceFlow/Services/IService.cs | 18 - src/SourceFlow/Services/Service.cs | 33 - .../Aggregates/AggregateTests.cs | 127 ++-- .../E2E/Aggregates/AccountAggregate.cs | 44 +- .../E2E/Aggregates/BankAccount.cs | 2 - .../E2E/Aggregates/IAccountAggregate.cs | 14 + .../E2E/Commands/ActivateAccount.cs | 4 +- .../E2E/Commands/CloseAccount.cs | 4 +- .../E2E/Commands/CreateAccount.cs | 5 +- .../E2E/Commands/DepositMoney.cs | 3 +- .../E2E/Commands/WithdrawMoney.cs | 4 +- tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs | 42 +- .../E2E/Events/AccountCreated.cs | 2 +- .../E2E/Events/AccountUpdated.cs | 2 +- .../E2E/Impl/InMemoryEventStore.cs | 17 +- .../E2E/Impl/InMemoryRepository.cs | 6 +- .../E2E/Impl/InMemoryViewProvider.cs | 5 +- .../E2E/Projections/AccountView.cs | 5 +- .../E2E/Sagas/AccountSaga.cs | 91 ++- .../E2E/Services/AccountService.cs | 78 --- .../E2E/Services/IAccountService.cs | 15 - ...erTests.cs => AggregateSubscriberTests.cs} | 27 +- .../Impl/CommandBusTests.cs | 244 ++++++- .../Impl/CommandPublisherTests.cs | 10 +- .../Impl/CommandReplayerTests.cs | 28 - .../Impl/DummyCommand.cs | 5 +- .../SourceFlow.Core.Tests/Impl/DummyEvent.cs | 2 +- .../Impl/EventQueueTests.cs | 122 +++- ...rTests.cs => ProjectionSubscriberTests.cs} | 30 +- .../Impl/SagaDispatcherTests.cs | 36 +- .../Interfaces/IEventReplayerTests.cs | 16 - .../Ioc/DummyCommandStore.cs | 4 +- .../Ioc/IocExtensionsTests.cs | 200 +----- .../Ioc/SourceFlowConfigTests.cs | 24 - .../Ioc/TestImplementations.cs | 73 +++ .../Messaging/CommandTests.cs | 13 +- .../Messaging/EventTests.cs | 3 +- .../SourceFlow.Core.Tests/Sagas/SagaTests.cs | 39 +- .../Services/ServiceTests.cs | 39 -- .../SourceFlow.Core.Tests.csproj | 4 + 96 files changed, 1486 insertions(+), 2060 deletions(-) create mode 100644 src/SourceFlow.ConsoleApp/Aggregates/IAccountAggregate.cs delete mode 100644 src/SourceFlow.ConsoleApp/Services/AccountService.cs delete mode 100644 src/SourceFlow.ConsoleApp/Services/IAccountService.cs rename src/SourceFlow/{Impl/AggregateDispatcher.cs => Aggregate/EventSubscriber.cs} (64%) delete mode 100644 src/SourceFlow/ClassDiagram.cd rename src/SourceFlow/{Aggregate => }/IEntity.cs (70%) delete mode 100644 src/SourceFlow/Impl/CommandReplayer.cs delete mode 100644 src/SourceFlow/Messaging/Bus/ICommandDispatcher.cs delete mode 100644 src/SourceFlow/Messaging/Bus/ICommandReplayer.cs delete mode 100644 src/SourceFlow/Messaging/Bus/IEventDispatcher.cs rename src/SourceFlow/{ => Messaging/Bus}/Impl/CommandBus.cs (74%) rename src/SourceFlow/Messaging/{ => Commands}/Command.cs (60%) create mode 100644 src/SourceFlow/Messaging/Commands/ICommand.cs create mode 100644 src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs rename src/SourceFlow/Messaging/{Bus => Commands}/ICommandPublisher.cs (66%) create mode 100644 src/SourceFlow/Messaging/Commands/ICommandSubscriber.cs create mode 100644 src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs rename src/SourceFlow/{ => Messaging/Commands}/Impl/CommandPublisher.cs (69%) rename src/SourceFlow/Messaging/{ => Events}/Event.cs (85%) rename src/SourceFlow/Messaging/{ => Events}/IEvent.cs (81%) create mode 100644 src/SourceFlow/Messaging/Events/IEventDispatcher.cs rename src/SourceFlow/Messaging/{Bus => Events}/IEventQueue.cs (63%) create mode 100644 src/SourceFlow/Messaging/Events/IEventSubscriber.cs create mode 100644 src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs rename src/SourceFlow/{ => Messaging/Events}/Impl/EventQueue.cs (76%) delete mode 100644 src/SourceFlow/Messaging/ICommand.cs rename src/SourceFlow/{Impl/ProjectionDispatcher.cs => Projections/EventSubscriber.cs} (64%) rename src/SourceFlow/{Impl/SagaDispatcher.cs => Saga/CommandSubscriber.cs} (67%) create mode 100644 src/SourceFlow/Saga/IHandlesWithEvent.cs delete mode 100644 src/SourceFlow/Services/IService.cs delete mode 100644 src/SourceFlow/Services/Service.cs create mode 100644 tests/SourceFlow.Core.Tests/E2E/Aggregates/IAccountAggregate.cs delete mode 100644 tests/SourceFlow.Core.Tests/E2E/Services/AccountService.cs delete mode 100644 tests/SourceFlow.Core.Tests/E2E/Services/IAccountService.cs rename tests/SourceFlow.Core.Tests/Impl/{AggregateDispatcherTests.cs => AggregateSubscriberTests.cs} (54%) delete mode 100644 tests/SourceFlow.Core.Tests/Impl/CommandReplayerTests.cs rename tests/SourceFlow.Core.Tests/Impl/{ProjectionDispatcherTests.cs => ProjectionSubscriberTests.cs} (54%) delete mode 100644 tests/SourceFlow.Core.Tests/Interfaces/IEventReplayerTests.cs delete mode 100644 tests/SourceFlow.Core.Tests/Ioc/SourceFlowConfigTests.cs create mode 100644 tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs delete mode 100644 tests/SourceFlow.Core.Tests/Services/ServiceTests.cs diff --git a/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs b/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs index 9706ec7..48cf38c 100644 --- a/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs +++ b/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs @@ -1,59 +1,64 @@ +using Microsoft.Extensions.Logging; using SourceFlow.Aggregate; using SourceFlow.ConsoleApp.Commands; using SourceFlow.ConsoleApp.Events; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Aggregates { public class AccountAggregate : Aggregate, - ISubscribes - + ISubscribes, IAccountAggregate { - public void CreateAccount(int accountId, string holder, decimal amount) + public AccountAggregate(ICommandPublisher commandPublisher, ILogger logger) + : base(commandPublisher, logger) + { + } + + public Task CreateAccount(int accountId, string holder, decimal amount) { - Send(new CreateAccount(new Payload + return Send(new CreateAccount(new Payload { - Id = accountId, AccountName = holder, InitialAmount = amount })); } - public void Deposit(int accountId, decimal amount) + public Task Deposit(int accountId, decimal amount) { - Send(new DepositMoney(new TransactPayload + return Send(new DepositMoney(accountId, new TransactPayload { - Id = accountId, Amount = amount, Type = TransactionType.Deposit })); } - public void Withdraw(int accountId, decimal amount) + public Task Withdraw(int accountId, decimal amount) { - Send(new WithdrawMoney(new TransactPayload + return Send(new WithdrawMoney(accountId, new TransactPayload { - Id = accountId, Amount = amount, Type = TransactionType.Withdrawal })); } - public void Close(int accountId, string reason) + public Task CloseAccount(int accountId, string reason) { - Send(new CloseAccount(new ClosurePayload + return Send(new CloseAccount(accountId, new ClosurePayload { - Id = accountId, ClosureReason = reason })); } public Task Handle(AccountCreated @event) { - return Send(new ActivateAccount(new ActivationPayload + return Send(new ActivateAccount(@event.Payload.Id, new ActivationPayload { - Id = @event.Payload.Id, ActiveOn = DateTime.UtcNow, })); } + + public Task RepayHistory(int accountId) { + return commandPublisher.ReplayCommands(accountId); + } } } \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Aggregates/BankAccount.cs b/src/SourceFlow.ConsoleApp/Aggregates/BankAccount.cs index 39adf33..2ed373d 100644 --- a/src/SourceFlow.ConsoleApp/Aggregates/BankAccount.cs +++ b/src/SourceFlow.ConsoleApp/Aggregates/BankAccount.cs @@ -1,5 +1,3 @@ -using SourceFlow.Aggregate; - namespace SourceFlow.ConsoleApp.Aggregates { public class BankAccount : IEntity diff --git a/src/SourceFlow.ConsoleApp/Aggregates/IAccountAggregate.cs b/src/SourceFlow.ConsoleApp/Aggregates/IAccountAggregate.cs new file mode 100644 index 0000000..ea5b433 --- /dev/null +++ b/src/SourceFlow.ConsoleApp/Aggregates/IAccountAggregate.cs @@ -0,0 +1,14 @@ +using SourceFlow.ConsoleApp.Events; + +namespace SourceFlow.ConsoleApp.Aggregates +{ + public interface IAccountAggregate + { + Task CloseAccount(int accountId, string reason); + Task CreateAccount(int accountId, string holder, decimal amount); + Task Deposit(int accountId, decimal amount); + Task Handle(AccountCreated @event); + Task Withdraw(int accountId, decimal amount); + Task RepayHistory(int accountId); + } +} \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Commands/ActivateAccount.cs b/src/SourceFlow.ConsoleApp/Commands/ActivateAccount.cs index fd78929..0a915a0 100644 --- a/src/SourceFlow.ConsoleApp/Commands/ActivateAccount.cs +++ b/src/SourceFlow.ConsoleApp/Commands/ActivateAccount.cs @@ -1,10 +1,11 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Commands { public class ActivateAccount : Command { - public ActivateAccount(ActivationPayload payload) : base(payload) + public ActivateAccount(int entityId, ActivationPayload payload) : base(entityId, payload) { } } diff --git a/src/SourceFlow.ConsoleApp/Commands/CloseAccount.cs b/src/SourceFlow.ConsoleApp/Commands/CloseAccount.cs index b8ed5f9..59c384e 100644 --- a/src/SourceFlow.ConsoleApp/Commands/CloseAccount.cs +++ b/src/SourceFlow.ConsoleApp/Commands/CloseAccount.cs @@ -1,10 +1,11 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Commands { public class CloseAccount : Command { - public CloseAccount(ClosurePayload payload) : base(payload) + public CloseAccount(int entityId, ClosurePayload payload) : base(entityId, payload) { } } diff --git a/src/SourceFlow.ConsoleApp/Commands/CreateAccount.cs b/src/SourceFlow.ConsoleApp/Commands/CreateAccount.cs index 8251038..8a39ca5 100644 --- a/src/SourceFlow.ConsoleApp/Commands/CreateAccount.cs +++ b/src/SourceFlow.ConsoleApp/Commands/CreateAccount.cs @@ -1,10 +1,10 @@ -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Commands { public class CreateAccount : Command { - public CreateAccount(Payload payload) : base(payload) + public CreateAccount(Payload payload) : base(true, payload) { } } diff --git a/src/SourceFlow.ConsoleApp/Commands/DepositMoney.cs b/src/SourceFlow.ConsoleApp/Commands/DepositMoney.cs index 49153a0..19914f4 100644 --- a/src/SourceFlow.ConsoleApp/Commands/DepositMoney.cs +++ b/src/SourceFlow.ConsoleApp/Commands/DepositMoney.cs @@ -1,10 +1,11 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Commands { public class DepositMoney : Command { - public DepositMoney(TransactPayload payload) : base(payload) + public DepositMoney(int entityId, TransactPayload payload) : base(entityId, payload) { } } diff --git a/src/SourceFlow.ConsoleApp/Commands/Payload.cs b/src/SourceFlow.ConsoleApp/Commands/Payload.cs index 20165ca..48929fe 100644 --- a/src/SourceFlow.ConsoleApp/Commands/Payload.cs +++ b/src/SourceFlow.ConsoleApp/Commands/Payload.cs @@ -4,21 +4,18 @@ namespace SourceFlow.ConsoleApp.Commands { public class ActivationPayload : IPayload - { - public int Id { get; set; } + { public DateTime ActiveOn { get; set; } } public class Payload : IPayload { - public int Id { get; set; } public decimal InitialAmount { get; set; } public string AccountName { get; set; } } public class TransactPayload : IPayload { - public int Id { get; set; } public TransactionType Type { get; set; } public decimal Amount { get; set; } public decimal CurrentBalance { get; set; } @@ -26,7 +23,6 @@ public class TransactPayload : IPayload public class ClosurePayload : IPayload { - public int Id { get; set; } public bool IsClosed { get; set; } public string ClosureReason { get; set; } = string.Empty; } diff --git a/src/SourceFlow.ConsoleApp/Commands/WithdrawMoney.cs b/src/SourceFlow.ConsoleApp/Commands/WithdrawMoney.cs index a546eeb..2491df0 100644 --- a/src/SourceFlow.ConsoleApp/Commands/WithdrawMoney.cs +++ b/src/SourceFlow.ConsoleApp/Commands/WithdrawMoney.cs @@ -1,10 +1,11 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Commands { public class WithdrawMoney : Command { - public WithdrawMoney(TransactPayload payload) : base(payload) + public WithdrawMoney(int entityId, TransactPayload payload) : base(entityId, payload) { } } diff --git a/src/SourceFlow.ConsoleApp/Events/AccountCreated.cs b/src/SourceFlow.ConsoleApp/Events/AccountCreated.cs index 896ea31..43d6b3d 100644 --- a/src/SourceFlow.ConsoleApp/Events/AccountCreated.cs +++ b/src/SourceFlow.ConsoleApp/Events/AccountCreated.cs @@ -1,5 +1,5 @@ using SourceFlow.ConsoleApp.Aggregates; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.ConsoleApp.Events { diff --git a/src/SourceFlow.ConsoleApp/Events/AccountUpdated.cs b/src/SourceFlow.ConsoleApp/Events/AccountUpdated.cs index 59bc470..aa87c67 100644 --- a/src/SourceFlow.ConsoleApp/Events/AccountUpdated.cs +++ b/src/SourceFlow.ConsoleApp/Events/AccountUpdated.cs @@ -1,5 +1,5 @@ using SourceFlow.ConsoleApp.Aggregates; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.ConsoleApp.Events { diff --git a/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs b/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs index 8279a3b..ca2d519 100644 --- a/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs +++ b/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs @@ -1,5 +1,6 @@ using System.Collections.Concurrent; using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Impl { @@ -7,26 +8,26 @@ public class InMemoryCommandStore : ICommandStore { private readonly ConcurrentDictionary> _store = new(); - public Task Append(ICommand @event) + public Task Append(ICommand command) { - if (!_store.ContainsKey(@event.Payload.Id)) - _store[@event.Payload.Id] = new List(); + if (!_store.ContainsKey(command.Entity.Id)) + _store[command.Entity.Id] = new List(); - _store[@event.Payload.Id].Add(@event); + _store[command.Entity.Id].Add(command); return Task.CompletedTask; } - public async Task> Load(int aggregateId) + public async Task> Load(int entityId) { - return await Task.FromResult(_store.TryGetValue(aggregateId, out var events) + return await Task.FromResult(_store.TryGetValue(entityId, out var events) ? events : Enumerable.Empty()); } - public Task GetNextSequenceNo(int aggregateId) + public Task GetNextSequenceNo(int entityId) { - if (_store.TryGetValue(aggregateId, out var events)) + if (_store.TryGetValue(entityId, out var events)) { return Task.FromResult(events.Max(c => ((IMetadata)c).Metadata.SequenceNo) + 1); } diff --git a/src/SourceFlow.ConsoleApp/Impl/InMemoryRepository.cs b/src/SourceFlow.ConsoleApp/Impl/InMemoryRepository.cs index 64c1d8b..b5b840d 100644 --- a/src/SourceFlow.ConsoleApp/Impl/InMemoryRepository.cs +++ b/src/SourceFlow.ConsoleApp/Impl/InMemoryRepository.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using SourceFlow.Aggregate; namespace SourceFlow.ConsoleApp.Impl { @@ -24,7 +23,10 @@ public Task Get(int id) where TEntity : class, IEntity var success = _cache.TryGetValue(id, out var entity); - return Task.FromResult(success ? (TEntity)entity : null); + if (!success || entity == null) + throw new InvalidOperationException($"Entity not found for ID: {id}"); + + return Task.FromResult((TEntity)entity); } public Task Persist(TEntity entity) where TEntity : IEntity diff --git a/src/SourceFlow.ConsoleApp/Impl/InMemoryViewProvider.cs b/src/SourceFlow.ConsoleApp/Impl/InMemoryViewProvider.cs index ec32f93..f954909 100644 --- a/src/SourceFlow.ConsoleApp/Impl/InMemoryViewProvider.cs +++ b/src/SourceFlow.ConsoleApp/Impl/InMemoryViewProvider.cs @@ -24,7 +24,10 @@ public Task Find(int id) where TViewModel : class, IView var success = _cache.TryGetValue(id, out var model); - return Task.FromResult(success ? (TViewModel)model : null); + if (!success || model == null) + throw new InvalidOperationException($"ViewModel not found for ID: {id}"); + + return Task.FromResult((TViewModel)model); } public Task Push(TViewModel model) where TViewModel : IViewModel diff --git a/src/SourceFlow.ConsoleApp/Program.cs b/src/SourceFlow.ConsoleApp/Program.cs index 9d067d7..812df00 100644 --- a/src/SourceFlow.ConsoleApp/Program.cs +++ b/src/SourceFlow.ConsoleApp/Program.cs @@ -1,8 +1,9 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using SourceFlow; +using SourceFlow.Aggregate; +using SourceFlow.ConsoleApp.Aggregates; using SourceFlow.ConsoleApp.Projections; -using SourceFlow.ConsoleApp.Services; using SourceFlow.Saga; // Ensure this using is present var services = new ServiceCollection(); @@ -14,86 +15,80 @@ builder.SetMinimumLevel(LogLevel.Information); }); -//services.UseSourceFlow(config => -//{ -// config.WithAggregate(); -// config.WithSaga(); -// config.WithService(); -//}); - services.UseSourceFlow(); var serviceProvider = services.BuildServiceProvider(); Console.WriteLine("=== Command Sourcing Demo ===\n"); -var accountService = serviceProvider.GetRequiredService(); +var aggregate = (AccountAggregate)serviceProvider.GetRequiredService(); var saga = serviceProvider.GetRequiredService(); var logger = serviceProvider.GetRequiredService>(); var viewProvider = serviceProvider.GetRequiredService(); // Create account -var accountId = await accountService.CreateAccountAsync("John Doe", 1000m); +var accountId = 999; +await aggregate.CreateAccount(accountId, "John Doe", 1000m); logger.LogInformation("Action=Program_Create_Account, Account: {accountId}", accountId); // Perform operations var amount = 500m; logger.LogInformation("Action=Program_Deposit, Amount={Amount}", amount); -await accountService.DepositAsync(accountId, amount); +await aggregate.Deposit(accountId, amount); amount = 200m; logger.LogInformation("Action=Program_Withdraw, Amount={Amount}", amount); -await accountService.WithdrawAsync(accountId, amount); +await aggregate.Withdraw(accountId, amount); amount = 100m; logger.LogInformation("Action=Program_Deposit, Amount={Amount}", amount); -await accountService.DepositAsync(accountId, amount); +await aggregate.Deposit(accountId, amount); // Find current state var account = await viewProvider.Find(accountId); Console.WriteLine($"\nCurrent Account State:"); -Console.WriteLine($"- Account Id: {account?.Id}"); -Console.WriteLine($"- Holder: {account?.AccountName}"); -Console.WriteLine($"- Created On: {account?.CreatedDate}"); -Console.WriteLine($"- Activated On: {account?.ActiveOn}"); -Console.WriteLine($"- Current Balance: ${account?.CurrentBalance}"); -Console.WriteLine($"- Transaction Count: {account?.TransactionCount}"); -Console.WriteLine($"- Is A/C Closed: {account?.IsClosed}"); -Console.WriteLine($"- Last updated: {account?.LastUpdated}"); -Console.WriteLine($"- Version: {account?.Version}"); +Console.WriteLine($"- Account EntityId: {account.Id}"); +Console.WriteLine($"- Holder: {account.AccountName}"); +Console.WriteLine($"- Created On: {account.CreatedDate}"); +Console.WriteLine($"- Activated On: {account.ActiveOn}"); +Console.WriteLine($"- Current Balance: ${account.CurrentBalance}"); +Console.WriteLine($"- Transaction Count: {account.TransactionCount}"); +Console.WriteLine($"- Is A/C Closed: {account.IsClosed}"); +Console.WriteLine($"- Last updated: {account.LastUpdated}"); +Console.WriteLine($"- Version: {account.Version}"); // Show event history Console.WriteLine($"\nReplay Account History:"); -await accountService.ReplayHistoryAsync(accountId); +await aggregate.ReplayCommands(accountId); // Show account summary by replaying history. account = await viewProvider.Find(accountId); Console.WriteLine($"\nCurrent Account State:"); -Console.WriteLine($"- Account Id: {account?.Id}"); -Console.WriteLine($"- Holder: {account?.AccountName}"); -Console.WriteLine($"- Created On: {account?.CreatedDate}"); -Console.WriteLine($"- Activated On: {account?.ActiveOn}"); -Console.WriteLine($"- Current Balance: ${account?.CurrentBalance}"); -Console.WriteLine($"- Transaction Count: {account?.TransactionCount}"); -Console.WriteLine($"- Is A/C Closed: {account?.IsClosed}"); -Console.WriteLine($"- Last updated: {account?.LastUpdated}"); -Console.WriteLine($"- Version: {account?.Version}"); +Console.WriteLine($"- Account EntityId: {account.Id}"); +Console.WriteLine($"- Holder: {account.AccountName}"); +Console.WriteLine($"- Created On: {account.CreatedDate}"); +Console.WriteLine($"- Activated On: {account.ActiveOn}"); +Console.WriteLine($"- Current Balance: ${account.CurrentBalance}"); +Console.WriteLine($"- Transaction Count: {account.TransactionCount}"); +Console.WriteLine($"- Is A/C Closed: {account.IsClosed}"); +Console.WriteLine($"- Last updated: {account.LastUpdated}"); +Console.WriteLine($"- Version: {account.Version}"); // Close account -await accountService.CloseAccountAsync(accountId, "Customer account close request"); +await aggregate.CloseAccount(accountId, "Customer account close request"); Console.WriteLine($"\nClose Account"); //// Final state account = await viewProvider.Find(accountId); Console.WriteLine($"\nCurrent Account State:"); -Console.WriteLine($"- Account Id: {account?.Id}"); -Console.WriteLine($"- Holder: {account?.AccountName}"); -Console.WriteLine($"- Created On: {account?.CreatedDate}"); -Console.WriteLine($"- Activated On: {account?.ActiveOn}"); -Console.WriteLine($"- Current Balance: ${account?.CurrentBalance}"); -Console.WriteLine($"- Transaction Count: {account?.TransactionCount}"); -Console.WriteLine($"- Is A/C Closed: {account?.IsClosed}"); -Console.WriteLine($"- Last updated: {account?.LastUpdated}"); -Console.WriteLine($"- Version: {account?.Version}"); +Console.WriteLine($"- Account EntityId: {account.Id}"); +Console.WriteLine($"- Holder: {account.AccountName}"); +Console.WriteLine($"- Created On: {account.CreatedDate}"); +Console.WriteLine($"- Activated On: {account.ActiveOn}"); +Console.WriteLine($"- Current Balance: ${account.CurrentBalance}"); +Console.WriteLine($"- Transaction Count: {account.TransactionCount}"); +Console.WriteLine($"- Is A/C Closed: {account.IsClosed}"); +Console.WriteLine($"- Last updated: {account.LastUpdated}"); +Console.WriteLine($"- Version: {account.Version}"); Console.WriteLine("\nPress any key to exit..."); \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Projections/AccountView.cs b/src/SourceFlow.ConsoleApp/Projections/AccountView.cs index 3c4b786..0610182 100644 --- a/src/SourceFlow.ConsoleApp/Projections/AccountView.cs +++ b/src/SourceFlow.ConsoleApp/Projections/AccountView.cs @@ -24,7 +24,7 @@ public async Task Apply(AccountCreated @event) CreatedDate = @event.Payload.CreatedOn, LastUpdated = DateTime.UtcNow, TransactionCount = 0, - ClosureReason = null, + ClosureReason = null!, Version = 1 }; @@ -35,9 +35,6 @@ public async Task Apply(AccountUpdated @event) { var view = await provider.Find(@event.Payload.Id); - if (view == null) - throw new InvalidOperationException($"Account view not found for ID: {@event.Payload.Id}"); - view.CurrentBalance = @event.Payload.Balance; view.LastUpdated = DateTime.UtcNow; view.AccountName = @event.Payload.AccountName; diff --git a/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs b/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs index 6e8fb91..53d9320 100644 --- a/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs +++ b/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs @@ -2,21 +2,28 @@ using SourceFlow.ConsoleApp.Aggregates; using SourceFlow.ConsoleApp.Commands; using SourceFlow.ConsoleApp.Events; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; using SourceFlow.Saga; namespace SourceFlow.ConsoleApp.Sagas { public class AccountSaga : Saga, - IHandles, - IHandles, - IHandles, - IHandles, - IHandles + IHandlesWithEvent, + IHandlesWithEvent, + IHandlesWithEvent, + IHandlesWithEvent, + IHandles { - public async Task Handle(CreateAccount command) + public AccountSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : + base(commandPublisher, eventQueue, repository, logger) + { + } + + public async Task Handle(IEntity entity, CreateAccount command) { logger.LogInformation("Action=Account_Created, Account={AccountId}, Holder={AccountName}, Initial_Balance={InitialBalance}", - command.Payload.Id, command.Payload.AccountName, command.Payload.InitialAmount); + command.Entity.Id, command.Payload.AccountName, command.Payload.InitialAmount); if (string.IsNullOrEmpty(command.Payload.AccountName)) throw new ArgumentException("Account create requires account holder name.", nameof(command.Payload.AccountName)); @@ -24,95 +31,73 @@ public async Task Handle(CreateAccount command) if (command.Payload.InitialAmount <= 0) throw new ArgumentException("Account create requires initial amount.", nameof(command.Payload.InitialAmount)); - var account = new BankAccount - { - Id = command.Payload.Id, - AccountName = command.Payload.AccountName, - Balance = command.Payload.InitialAmount - }; - - await repository.Persist(account); + var account = (BankAccount)entity; - await Raise(new AccountCreated(account)); + account.AccountName = command.Payload.AccountName; + account.Balance = command.Payload.InitialAmount; } - public async Task Handle(ActivateAccount command) + public async Task Handle(IEntity entity, ActivateAccount command) { - logger.LogInformation("Action=Account_Activate, ActivatedOn={ActiveOn}, Account={AccountId}", command.Payload.ActiveOn, command.Payload.Id); - - var account = await repository.Get(command.Payload.Id); - - if (account.IsClosed) - throw new InvalidOperationException("Cannot deposit to a closed account"); + logger.LogInformation("Action=Account_Activate, ActivatedOn={ActiveOn}, Account={AccountId}", command.Payload.ActiveOn, command.Entity.Id); if (command.Payload.ActiveOn == DateTime.MinValue) throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.ActiveOn)); - account.ActiveOn = command.Payload.ActiveOn; + var account = (BankAccount)entity; - await repository.Persist(account); + if (account.IsClosed) + throw new InvalidOperationException("Cannot deposit to a closed account"); - await Raise(new AccountUpdated(account)); + account.ActiveOn = command.Payload.ActiveOn; } - public async Task Handle(DepositMoney command) + public async Task Handle(IEntity entity, DepositMoney command) { - logger.LogInformation("Action=Money_Deposited, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Payload.Id); + logger.LogInformation("Action=Money_Deposited, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Entity.Id); + + if (command.Payload.Amount <= 0) + throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot deposit to a closed account"); - if (command.Payload.Amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - command.Payload.CurrentBalance = account.Balance + command.Payload.Amount; account.Balance = command.Payload.CurrentBalance; - - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); } - public async Task Handle(WithdrawMoney command) + public async Task Handle(IEntity entity, WithdrawMoney command) { - logger.LogInformation("Action=Money_Withdrawn, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Payload.Id); + logger.LogInformation("Action=Money_Withdrawn, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Entity.Id); + + if (command.Payload.Amount <= 0) + throw new ArgumentException("Withdrawal amount must be positive", nameof(command.Payload.Amount)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot deposit to a closed account"); - if (command.Payload.Amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - command.Payload.CurrentBalance = account.Balance - command.Payload.Amount; account.Balance = command.Payload.CurrentBalance; - - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); } - public async Task Handle(CloseAccount command) + public async Task Handle(IEntity entity, CloseAccount command) { - logger.LogInformation("Action=Account_Closed, Account={AccountId}, Reason={Reason}", command.Payload.Id, command.Payload.ClosureReason); + logger.LogInformation("Action=Account_Closed, Account={AccountId}, Reason={Reason}", command.Entity.Id, command.Payload.ClosureReason); if (string.IsNullOrWhiteSpace(command.Payload.ClosureReason)) throw new ArgumentException("Reason for closing cannot be empty", nameof(command.Payload.ClosureReason)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot close account on a closed account"); account.ClosureReason = command.Payload.ClosureReason; account.IsClosed = command.Payload.IsClosed = true; - - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); } } -} \ No newline at end of file +} diff --git a/src/SourceFlow.ConsoleApp/Services/AccountService.cs b/src/SourceFlow.ConsoleApp/Services/AccountService.cs deleted file mode 100644 index 23d8309..0000000 --- a/src/SourceFlow.ConsoleApp/Services/AccountService.cs +++ /dev/null @@ -1,78 +0,0 @@ -using SourceFlow.ConsoleApp.Aggregates; -using SourceFlow.Services; - -namespace SourceFlow.ConsoleApp.Services -{ - public class AccountService : Service, IAccountService - { - public async Task CreateAccountAsync(string accountHolderName, decimal initialBalance) - { - if (string.IsNullOrEmpty(accountHolderName)) - throw new ArgumentException("Account create requires account holder name.", nameof(accountHolderName)); - - if (initialBalance <= 0) - throw new ArgumentException("Account create requires initial amount.", nameof(initialBalance)); - - var account = await CreateAggregate(); - if (account == null) - throw new InvalidOperationException("Failed to create account aggregate"); - - var accountId = new Random().Next(); // Simulating a unique account ID generation - - account.CreateAccount(accountId, accountHolderName, initialBalance); - - return accountId; - } - - public async Task DepositAsync(int accountId, decimal amount) - { - if (accountId <= 0) - throw new ArgumentException("Deposit amount must need account id", nameof(amount)); - - if (amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(amount)); - - var account = await CreateAggregate(); - - account.Deposit(accountId, amount); - } - - public async Task WithdrawAsync(int accountId, decimal amount) - { - if (accountId <= 0) - throw new ArgumentException("Withdraw amount must need account id", nameof(amount)); - - if (amount <= 0) - throw new ArgumentException("Withdraw amount must be positive", nameof(amount)); - - var account = await CreateAggregate(); - if (account == null) - throw new InvalidOperationException("Failed to create account aggregate"); - - account.Withdraw(accountId, amount); - } - - public async Task CloseAccountAsync(int accountId, string reason) - { - if (accountId <= 0) - throw new ArgumentException("Close account requires valid account id", nameof(accountId)); - - if (string.IsNullOrEmpty(reason)) - throw new ArgumentException("Close account requires reason", nameof(reason)); - - var account = await CreateAggregate(); - - account.Close(accountId, reason); - } - - public async Task ReplayHistoryAsync(int accountId) - { - if (accountId <= 0) - throw new ArgumentException("Account history requires valid account id", nameof(accountId)); - - var account = await CreateAggregate(); - - await account.Replay(accountId); - } - } -} \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Services/IAccountService.cs b/src/SourceFlow.ConsoleApp/Services/IAccountService.cs deleted file mode 100644 index 8c33cfa..0000000 --- a/src/SourceFlow.ConsoleApp/Services/IAccountService.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace SourceFlow.ConsoleApp.Services -{ - public interface IAccountService - { - Task CloseAccountAsync(int accountId, string reason); - - Task CreateAccountAsync(string accountHolderName, decimal initialBalance); - - Task DepositAsync(int accountId, decimal amount); - - Task WithdrawAsync(int accountId, decimal amount); - - Task ReplayHistoryAsync(int accountId); - } -} \ No newline at end of file diff --git a/src/SourceFlow/Aggregate/Aggregate.cs b/src/SourceFlow/Aggregate/Aggregate.cs index 451e164..d8c6486 100644 --- a/src/SourceFlow/Aggregate/Aggregate.cs +++ b/src/SourceFlow/Aggregate/Aggregate.cs @@ -1,41 +1,41 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Aggregate { /// /// Base class for aggregate roots in the event-driven architecture. /// - /// - public abstract class Aggregate : IAggregate - where TAggregate : class, IEntity + /// Aggregate Entity type + public abstract class Aggregate : IAggregate + where TEntity : class, IEntity { /// /// The command publisher used to publish commands. /// protected ICommandPublisher commandPublisher; - /// - /// The events replayer used to replay event stream for given aggregate. - /// - protected ICommandReplayer commandReplayer; - /// /// Logger for the aggregate root to log events and errors. /// - protected ILogger logger; + protected ILogger logger; + + protected Aggregate(ICommandPublisher commandPublisher, ILogger logger) + { + this.commandPublisher = commandPublisher; + this.logger = logger; + } /// - /// Replays the event stream for the aggregate root, restoring its state from past events. + /// Replays the command stream for the aggregate root, restoring its state from past history. /// - /// Unique Aggregate entity identifier. + /// Unique Aggregate entity identifier. /// - public Task Replay(int AggregateId) + public Task ReplayCommands(int entityId) { - return commandReplayer.Replay(AggregateId); + return commandPublisher.ReplayCommands(entityId); } /// @@ -50,9 +50,6 @@ protected Task Send(ICommand command) if (command == null) throw new ArgumentNullException(nameof(command)); - if (command.Payload?.Id == null) - throw new InvalidOperationException(nameof(command) + "requires Payload"); - return commandPublisher.Publish(command); } } diff --git a/src/SourceFlow/Impl/AggregateDispatcher.cs b/src/SourceFlow/Aggregate/EventSubscriber.cs similarity index 64% rename from src/SourceFlow/Impl/AggregateDispatcher.cs rename to src/SourceFlow/Aggregate/EventSubscriber.cs index fac7d57..f3a0457 100644 --- a/src/SourceFlow/Impl/AggregateDispatcher.cs +++ b/src/SourceFlow/Aggregate/EventSubscriber.cs @@ -3,21 +3,20 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Aggregate; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Events; +using SourceFlow.Messaging.Events.Impl; -namespace SourceFlow.Impl +namespace SourceFlow.Aggregate { /// - /// This dispatcher is responsible for dispatching events to the appropriate subscribing aggregates. + /// This subscriber is responsible for dispatching event to subscribing aggregates. /// - internal class AggregateDispatcher : IEventDispatcher + internal class EventSubscriber : IEventSubscriber { /// /// Logger for the event queue to log events and errors. /// - private readonly ILogger logger; + private readonly ILogger logger; /// /// Represents a collection of aggregate root objects. @@ -33,7 +32,7 @@ internal class AggregateDispatcher : IEventDispatcher /// /// /// - public AggregateDispatcher(IEnumerable aggregates, ILogger logger) + public EventSubscriber(IEnumerable aggregates, ILogger logger) { this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); this.aggregates = aggregates ?? throw new ArgumentNullException(nameof(aggregates)); @@ -45,19 +44,18 @@ public AggregateDispatcher(IEnumerable aggregates, ILogger /// /// - private async Task Dispatch(TEvent @event) - where TEvent : IEvent + public async Task Subscribe(TEvent @event) where TEvent : IEvent { var tasks = new List(); foreach (var aggregate in aggregates) { - var handlerType = typeof(ISubscribes<>).MakeGenericType(@event.GetType()); + var handlerType = typeof(ISubscribes<>).MakeGenericType(typeof(TEvent)); if (!handlerType.IsAssignableFrom(aggregate.GetType())) continue; var method = typeof(ISubscribes<>) - .MakeGenericType(@event.GetType()) + .MakeGenericType(typeof(TEvent)) .GetMethod(nameof(ISubscribes.Handle)); var task = (Task)method.Invoke(aggregate, new object[] { @event }); @@ -65,22 +63,10 @@ private async Task Dispatch(TEvent @event) tasks.Add(task); logger?.LogInformation("Action=Event_Disptcher_Aggregate, Event={Event}, Aggregate={Aggregate}, Handler:{Handler}", - @event.GetType().Name, aggregate.GetType().Name, method.Name); + typeof(TEvent).Name, aggregate.GetType().Name, method.Name); } await Task.WhenAll(tasks); - } - - /// - /// Dispatches the event to both aggregates and view projections. - /// - /// - /// - public void Dispatch(object sender, IEvent @event) - { - Dispatch(@event).GetAwaiter().GetResult(); - logger?.LogInformation("Action=Event_Dispatcher_Complete, Event={Event}, Sender:{sender}", - @event.Name, sender.GetType().Name); - } + } } } \ No newline at end of file diff --git a/src/SourceFlow/Aggregate/ISubscribes.cs b/src/SourceFlow/Aggregate/ISubscribes.cs index 5c53bf8..5451567 100644 --- a/src/SourceFlow/Aggregate/ISubscribes.cs +++ b/src/SourceFlow/Aggregate/ISubscribes.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Aggregate { diff --git a/src/SourceFlow/ClassDiagram.cd b/src/SourceFlow/ClassDiagram.cd deleted file mode 100644 index d5d68a6..0000000 --- a/src/SourceFlow/ClassDiagram.cd +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - - - - - - - - - AAAAAAABAAACAIACAEAAAIACAAAAAAAAAAAAAAAAAAA= - Saga\Saga.cs - - - - - - - - - - - - AABAAAAAAAAAAAACAAAAAABAAAAAAAAAAAAAAAAAAAA= - Impl\EventQueue.cs - - - - - - - - - - - - - - - - - AAgAAAAAABAAAAACAAAAAABABAAAAAQAAAAAAAAAAAA= - Impl\CommandBus.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AAAAAAAAAAAAAAACAEBAAIAAAAAAAAAAAQAAAAAAAAA= - Aggregate\Aggregate.cs - - - - - - - - - - - - - - - - - - - - - AAAAAAAAAAAAAAAAACAQAAQAAAAAAAAAAAAAAAAEAAA= - Messaging\Event.cs - - - - - - - - - - - - - - - - - - - - - AAAAAAAAABAAAAAAAAAQAAQAAAAAAAAAAAAAAAAEAAA= - Messaging\Command.cs - - - - - - - - - - - - - - - - - - - - - AAAAQAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAA= - Impl\CommandReplayer.cs - - - - - - - - - - - - - - - - - - - - - AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAABAA= - Impl\CommandPublisher.cs - - - - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAABAEAAAAAAAAAAAAA= - Impl\AggregateFactory.cs - - - - - - - - - - - - - - AAAAAAAAAAAAAAACBAAAAAAACAAAAAAAAAAAAAAAAAA= - Services\Service.cs - - - - - - - - - - AAgAAAAAAAAAAEACAEAAAAAAAAABAAAAAAAAAAAAAAA= - Impl\SagaDispatcher.cs - - - - - - - - - - AAgAAAgAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Impl\AggregateDispatcher.cs - - - - - - - - - - AAgAAAAAAAAAAAACAAAAAAAAAAAAAAAAACAAAAAAAAA= - Impl\ProjectionDispatcher.cs - - - - - - - - - - AABAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA= - Messaging\Bus\IEventQueue.cs - - - - - - AAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA= - Messaging\Bus\ICommandPublisher.cs - - - - - - AAAAAAAAAAAAAABAAAAAAAIAAAEAAAAAAAAAAAAAAAA= - IRepository.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Aggregate\IAggregate.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ViewModel\IProjection.cs - - - - - - ABAAgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAA= - ICommandStore.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA= - Saga\ISaga.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAA= - Messaging\Bus\ICommandReplayer.cs - - - - - - AAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ViewModel\IProjection.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA= - Saga\IHandles.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA= - Aggregate\ISubscribes.cs - - - - - - AAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAQAAAAAAAAA= - Messaging\Bus\ICommandBus.cs - - - - - - AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Messaging\IPayload.cs - - - - - - AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Aggregate\IEntity.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA= - Aggregate\IAggregateFactory.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAACAA= - IViewProvider.cs - - - - - - AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - ViewModel\IViewModel.cs - - - - - - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Messaging\Bus\IEventDispatcher.cs - - - - - - AAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAA= - Messaging\Bus\ICommandDispatcher.cs - - - - \ No newline at end of file diff --git a/src/SourceFlow/ICommandStore.cs b/src/SourceFlow/ICommandStore.cs index 221cfce..e442baf 100644 --- a/src/SourceFlow/ICommandStore.cs +++ b/src/SourceFlow/ICommandStore.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow { diff --git a/src/SourceFlow/Aggregate/IEntity.cs b/src/SourceFlow/IEntity.cs similarity index 70% rename from src/SourceFlow/Aggregate/IEntity.cs rename to src/SourceFlow/IEntity.cs index 1b6764a..171318d 100644 --- a/src/SourceFlow/Aggregate/IEntity.cs +++ b/src/SourceFlow/IEntity.cs @@ -1,4 +1,4 @@ -namespace SourceFlow.Aggregate +namespace SourceFlow { public interface IEntity { diff --git a/src/SourceFlow/IRepository.cs b/src/SourceFlow/IRepository.cs index 3add50b..9c02882 100644 --- a/src/SourceFlow/IRepository.cs +++ b/src/SourceFlow/IRepository.cs @@ -1,5 +1,4 @@ using System.Threading.Tasks; -using SourceFlow.Aggregate; namespace SourceFlow { diff --git a/src/SourceFlow/Impl/CommandReplayer.cs b/src/SourceFlow/Impl/CommandReplayer.cs deleted file mode 100644 index 7a30646..0000000 --- a/src/SourceFlow/Impl/CommandReplayer.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Threading.Tasks; -using SourceFlow.Messaging.Bus; - -namespace SourceFlow.Impl -{ - /// - /// Interface for replaying commands in the event-driven architecture. - /// - internal class CommandReplayer : ICommandReplayer - { - /// - /// The command bus used to replay commands for a given aggregate. - /// - private readonly ICommandBus commandBus; - - /// - /// Initializes a new instance of the class. - /// - /// - public CommandReplayer(ICommandBus commandBus) - { - this.commandBus = commandBus; - } - - /// - /// Replays stream of commands for a given aggregate. - /// - /// Unique aggregate entity id. - /// - async Task ICommandReplayer.Replay(int aggregateId) - { - await commandBus.Replay(aggregateId); - } - } -} \ No newline at end of file diff --git a/src/SourceFlow/IocExtensions.cs b/src/SourceFlow/IocExtensions.cs index 8a2b0db..eb62ba7 100644 --- a/src/SourceFlow/IocExtensions.cs +++ b/src/SourceFlow/IocExtensions.cs @@ -8,522 +8,225 @@ using SourceFlow.Aggregate; using SourceFlow.Impl; using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Bus.Impl; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Commands.Impl; +using SourceFlow.Messaging.Events; +using SourceFlow.Messaging.Events.Impl; using SourceFlow.Projections; using SourceFlow.Saga; -using SourceFlow.Services; namespace SourceFlow { /// - /// Extension methods for setting up SourceFlow using ioc container. + /// Extension methods for setting up SourceFlow using IoC container. /// public static class IocExtensions { /// /// Configures the SourceFlow with aggregates, sagas and services with IoC Container. - /// Only supports when aggregates, sagas and services can be initialized with default constructor. /// - /// - public static void UseSourceFlow(this IServiceCollection services) + /// The service collection to register services with. + /// Optional parameter to specify assemblies to scan for implementations. + /// If not provided, uses the current SourceFlow assembly and calling assembly. + /// The service lifetime to use for registered services (default: Singleton). + public static void UseSourceFlow(this IServiceCollection services, params Assembly[] assemblies) { - UseSourceFlow(services, config => - { - config.WithAggregates(); - config.WithSagas(); - config.WithServices(); - }); + UseSourceFlow(services, ServiceLifetime.Singleton, assemblies); } /// /// Configures the SourceFlow with aggregates, sagas and services with IoC Container. - /// Supports custom configuration for aggregates, sagas and services. /// - /// - /// - public static void UseSourceFlow(this IServiceCollection services, Action configuration) + /// The service collection to register services with. + /// The service lifetime to use for registered services. + /// Optional parameter to specify assemblies to scan for implementations. + /// If not provided, uses the current SourceFlow assembly and calling assembly. + public static void UseSourceFlow(this IServiceCollection services, ServiceLifetime lifetime, params Assembly[] assemblies) { - services.AddAsImplementationsOfInterface(lifetime: ServiceLifetime.Singleton); - services.AddAsImplementationsOfInterface(lifetime: ServiceLifetime.Singleton); - services.AddAsImplementationsOfInterface(lifetime: ServiceLifetime.Singleton); - services.AddAsImplementationsOfInterface(lifetime: ServiceLifetime.Singleton); - - services.AddSingleton(c => new SagaDispatcher( - c.GetService>())); - - services.AddSingleton(c => new SagaDispatcher( - c.GetService>())); - - services.AddSingleton(c => - { - var commandBus = new CommandBus( - c.GetService(), - c.GetService>()); - - var dispatcher = c.GetService(); - commandBus.Dispatchers += dispatcher.Dispatch; - - return commandBus; - }); - - services.AddSingleton(c => new AggregateDispatcher( - c.GetServices(), - c.GetService>()) - ); - - services.AddSingleton(c => new AggregateDispatcher( - c.GetServices(), - c.GetService>()) - ); - - services.AddSingleton(c => new ProjectionDispatcher( - c.GetServices(), - c.GetService>()) - ); - - services.AddSingleton(c => new ProjectionDispatcher( - c.GetServices(), - c.GetService>()) - ); - services.AddSingleton(c => + // If no assemblies are specified, scan assemblies that contain SourceFlow types and calling assembly + if (assemblies.Length == 0) { - var queue = new EventQueue( - c.GetService>()); - // need to register event handlers for the projection before aggregates - var projectionDispatcher = c.GetService(); - queue.Dispatchers += projectionDispatcher.Dispatch; - // need to register event handlers for the aggregates after projections - var aggregateDispatcher = c.GetService(); - queue.Dispatchers += aggregateDispatcher.Dispatch; - - return queue; - }); - - services.AddSingleton(); - services.AddSingleton(c => new CommandPublisher(c.GetService())); - services.AddSingleton(c => new CommandReplayer(c.GetService())); - - configuration(new SourceFlowConfig { Services = services }); + assemblies = new[] { + Assembly.GetExecutingAssembly(), + Assembly.GetCallingAssembly() + }; + } - //var serviceProvider = services.BuildServiceProvider(); - //var accountService = serviceProvider.GetRequiredService(); - //var saga = serviceProvider.GetRequiredService(); - //var logger = serviceProvider.GetRequiredService>(); - //var dataView = serviceProvider.GetRequiredService(); + // Register foundational services first - these have no dependencies on aggregates/sagas + services.AddAsImplementationsOfInterface(assemblies, lifetime); + services.AddAsImplementationsOfInterface(assemblies, lifetime); + services.AddAsImplementationsOfInterface(assemblies, lifetime); + services.AddAsImplementationsOfInterface(assemblies, lifetime); + + // Register factories + services.Add(ServiceDescriptor.Describe(typeof(IAggregateFactory), typeof(AggregateFactory), lifetime)); + + // Register Sagas and Aggregates with proper constructor injection + RegisterSagasWithConstructorInjection(services, assemblies, lifetime); + RegisterAggregatesWithConstructorInjection(services, assemblies, lifetime); + + // Register infrastructure services that depend on Sagas/Aggregates + services.AddSingleton(provider => + new CommandSubscriber( + provider.GetServices(), + provider.GetService>())); + + services.AddSingleton(provider => + new CommandDispatcher( + provider.GetServices(), + provider.GetService>())); + + services.AddSingleton(provider => + new CommandBus( + provider.GetService(), + provider.GetService(), + provider.GetService>())); + + services.AddSingleton(provider => + new CommandPublisher(provider.GetService())); + + // Register the concrete EventSubscriber implementations + services.AddSingleton(provider => + new Aggregate.EventSubscriber( + provider.GetServices(), + provider.GetService>())); + + services.AddSingleton(provider => + new Projections.EventSubscriber( + provider.GetServices(), + provider.GetService>())); + + // Register factory methods to get each implementation as IEventSubscriber + // This allows the DI container to collect both when requesting IEnumerable + services.AddSingleton(provider => + provider.GetRequiredService()); + services.AddSingleton(provider => + provider.GetRequiredService()); + + services.AddSingleton(provider => + new EventDispatcher( + provider.GetServices(), + provider.GetService>())); + + services.AddSingleton(provider => + new EventQueue( + provider.GetService(), + provider.GetService>())); } - /// - /// Registers a service with the SourceFlow configuration. - /// When factory is not provided, uses default constructor to create service instance. - /// - /// Service Type that implements IService. - /// - /// Factory to return service instance using service provider. - /// - public static ISourceFlowConfig WithService(this ISourceFlowConfig config, Func factory = null) - where TService : class, IService, new() + private static void RegisterSagasWithConstructorInjection(IServiceCollection services, Assembly[] assemblies, ServiceLifetime lifetime) { - ((SourceFlowConfig)config).Services.AddSingleton(c => + var sagaTypes = GetImplementedTypes(assemblies); + foreach (var sagaType in sagaTypes) { - var serviceInstance = factory != null ? factory(c) : new TService(); - - typeof(TService) - .GetField("aggregateFactory", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetRequiredService()); + // Register as interface ISaga + services.Add(ServiceDescriptor.Describe(typeof(ISaga), sagaType, lifetime)); - typeof(TService) - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetService>()); + // Register as concrete type for direct access + services.Add(ServiceDescriptor.Describe(sagaType, sagaType, lifetime)); - return serviceInstance; - }); - - var interfaces = typeof(TService).GetInterfaces(); - - foreach (var intrface in interfaces) - { - ((SourceFlowConfig)config).Services.AddSingleton(intrface, c => + // Register as all other interfaces the saga implements + var interfaces = sagaType.GetInterfaces() + .Where(i => i != typeof(ISaga) && i.IsPublic); + foreach (var iface in interfaces) { - var serviceInstance = factory != null ? factory(c) : new TService(); - - typeof(TService) - .GetField("aggregateFactory", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetRequiredService()); - - typeof(TService) - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetService>()); - - return serviceInstance; - }); + services.Add(ServiceDescriptor.Describe(iface, sagaType, lifetime)); + } } - - return config; } - /// - /// Registers an aggregate with the SourceFlow configuration. - /// When no factory is provided, uses default constructor to create aggregate instance. - /// - /// Aggregate implementation of IAggregate. - /// - /// Factory to return aggrgate instance using service provider. - /// - public static ISourceFlowConfig WithAggregate(this ISourceFlowConfig config, Func factory = null) - where TAggregate : class, IAggregate, new() + private static void RegisterAggregatesWithConstructorInjection(IServiceCollection services, Assembly[] assemblies, ServiceLifetime lifetime) { - ((SourceFlowConfig)config).Services.AddSingleton(c => + var aggregateTypes = GetImplementedTypes(assemblies); + foreach (var aggregateType in aggregateTypes) { - var aggrgateInstance = factory != null ? factory(c) : new TAggregate(); - - typeof(TAggregate) - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - typeof(TAggregate) - .GetField("commandReplayer", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - typeof(TAggregate) - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetService>()); - - return aggrgateInstance; - }); - - ((SourceFlowConfig)config).Services.AddSingleton(c => - { - var aggrgateInstance = factory != null ? factory(c) : new TAggregate(); - - typeof(TAggregate) - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - typeof(TAggregate) - .GetField("commandReplayer", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); + // Register as interface IAggregate + services.Add(ServiceDescriptor.Describe(typeof(IAggregate), aggregateType, lifetime)); - typeof(TAggregate) - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetService>()); + // Register as concrete type for direct access + services.Add(ServiceDescriptor.Describe(aggregateType, aggregateType, lifetime)); - return aggrgateInstance; - }); - - return config; - } - - /// - /// Registers a saga with the SourceFlow configuration. - /// When no factory is provided, uses default constructor to create saga instance. - /// - /// Aggregate implementation supported by TSaga. Implementation of IAggregate. - /// Saga that implementation for a given Aggregate. Implementation of ISaga. - /// - /// Factory to return aggrgate instance using service provider. - /// - /// - public static ISourceFlowConfig WithSaga(this ISourceFlowConfig config, Func> factory = null) - where TAggregate : IEntity - where TSaga : class, ISaga, new() - { - ((SourceFlowConfig)config).Services.AddSingleton(c => - { - var saga = factory != null ? factory(c) : new TSaga(); - - if (saga == null) - throw new InvalidOperationException($"Saga registration for {typeof(TAggregate).Name} returned null."); - - typeof(TSaga) - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(saga, c.GetRequiredService()); - - typeof(TSaga) - .GetField("eventQueue", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(saga, c.GetRequiredService()); - - typeof(TSaga) - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(saga, c.GetService>()); - - typeof(TSaga) - .GetField("repository", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(saga, c.GetRequiredService()); - - var dispatcher = c.GetRequiredService(); - dispatcher.Register(saga); - - return (TSaga)saga; - }); - - return config; + // Register as all other interfaces the aggregate implements + var interfaces = aggregateType.GetInterfaces() + .Where(i => i != typeof(IAggregate) && i.IsPublic); + foreach (var iface in interfaces) + { + services.Add(ServiceDescriptor.Describe(iface, aggregateType, lifetime)); + } + } } /// /// Registers all implementations of a given interface in the IoC container. /// - /// - /// - /// - /// - private static IServiceCollection AddAsImplementationsOfInterface(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped) + /// The interface to register implementations for. + /// The service collection to register services with. + /// The assemblies to scan for implementations. + /// The service lifetime for registered implementations. + /// The service collection for chaining. + private static IServiceCollection AddAsImplementationsOfInterface(this IServiceCollection services, Assembly[] assemblies, ServiceLifetime lifetime = ServiceLifetime.Singleton) { var interfaceType = typeof(TInterface); - - var assemblies = AppDomain.CurrentDomain - .GetAssemblies() - .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location)); - - var implementationTypes = assemblies - .SelectMany(a => - { - try - { return a.GetTypes(); } - catch { return Array.Empty(); } // Prevent ReflectionTypeLoadException - }) - .Where(t => - interfaceType.IsAssignableFrom(t) && - t.IsClass && !t.IsAbstract && !t.IsGenericType); + var implementationTypes = GetImplementedTypes(interfaceType, assemblies); foreach (var implType in implementationTypes) { - services.TryAddEnumerable(ServiceDescriptor.Describe(interfaceType, implType, lifetime)); + services.Add(ServiceDescriptor.Describe(interfaceType, implType, lifetime)); - var interfaces = implType.GetInterfaces().Where(t => !t.AssemblyQualifiedName.Equals(interfaceType.AssemblyQualifiedName)); + // Register implementation as all of its interfaces (except the main one) + var interfaces = implType.GetInterfaces() + .Where(i => i != interfaceType && i.IsPublic) + .Distinct(); // Avoid duplicate registrations - foreach (var intrface in interfaces) + foreach (var iface in interfaces) { - services.TryAddEnumerable(ServiceDescriptor.Describe(intrface, implType, lifetime)); + services.Add(ServiceDescriptor.Describe(iface, implType, lifetime)); } } return services; } - /// - /// Gets all types that implement a given interface from all loaded assemblies. - /// - /// - /// - private static IEnumerable GetTypesFromAssemblies(Type interfaceType) + private static IEnumerable GetImplementedTypes(Assembly[] assemblies) { - var assemblies = AppDomain.CurrentDomain - .GetAssemblies() - .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location)); + return GetImplementedTypes(typeof(TInterface), assemblies); + } + private static IEnumerable GetImplementedTypes(Type interfaceType, Assembly[] assemblies) + { var implementationTypes = assemblies + .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location)) .SelectMany(a => { try - { return a.GetTypes(); } - catch { return Array.Empty(); } // Prevent ReflectionTypeLoadException - }) - .Where(t => - interfaceType.IsAssignableFrom(t) && - t.IsClass && !t.IsAbstract && !t.IsGenericType); - - return implementationTypes; - } - - /// - /// Registers all services that implement the IService interface in the IoC container. - /// When factory is not provided, uses default constructor to create service instances. - /// - /// - /// Factory to return service instances by given type. - /// - /// - public static ISourceFlowConfig WithServices(this ISourceFlowConfig config, Func serviceFactory = null) - { - var interfaceType = typeof(IService); - var implementationTypes = GetTypesFromAssemblies(interfaceType); - - foreach (var implType in implementationTypes) - { - var serviceInstance = serviceFactory != null - ? serviceFactory(implType) - : (IService)Activator.CreateInstance(implType); - - if (serviceInstance == null) - throw new InvalidOperationException($"Service registration for {implType.Name} returned null."); - - var loggerType = typeof(ILogger<>).MakeGenericType(implType); - - ((SourceFlowConfig)config).Services.AddSingleton(c => - { - implType - .GetField("aggregateFactory", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetRequiredService()); - - implType - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, (ILogger)c.GetService(loggerType)); - - return serviceInstance; - }); - - var interfaces = implType.GetInterfaces(); - - foreach (var intrface in interfaces) - ((SourceFlowConfig)config).Services.AddSingleton(intrface, c => { - implType - .GetField("aggregateFactory", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, c.GetRequiredService()); - - implType - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(serviceInstance, (ILogger)c.GetService(loggerType)); - - return serviceInstance; - }); - } - - return config; - } - - /// - /// Registers all aggregates that implement the IAggregate interface in the IoC container. - /// When factory is not provided, uses default constructor to create aggrgate instances. - /// - /// - /// Factory to return aggregate instances by given type. - /// - /// - public static ISourceFlowConfig WithAggregates(this ISourceFlowConfig config, Func aggregateFactory = null) - { - var interfaceType = typeof(IAggregate); - var implementationTypes = GetTypesFromAssemblies(interfaceType); - - foreach (var implType in implementationTypes) - { - var aggrgateInstance = aggregateFactory != null - ? aggregateFactory(implType) - : (IAggregate)Activator.CreateInstance(implType); - - if (aggrgateInstance == null) - throw new InvalidOperationException($"Aggregate registration for {implType.Name} returned null."); - - var loggerType = typeof(ILogger<>).MakeGenericType(implType); - - ((SourceFlowConfig)config).Services.AddSingleton(implType, c => - { - implType - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - implType - .GetField("commandReplayer", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - implType - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, (ILogger)c.GetService(loggerType)); - - return aggrgateInstance; - }); - - var interfaces = implType.GetInterfaces(); - - foreach (var intrface in interfaces) - ((SourceFlowConfig)config).Services.AddSingleton(intrface, c => + return a.GetTypes() + .Where(t => interfaceType.IsAssignableFrom(t) && + t.IsClass && + !t.IsAbstract && + !t.IsGenericType && + !t.ContainsGenericParameters); + } + catch (ReflectionTypeLoadException) { - implType - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - implType - .GetField("commandReplayer", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, c.GetRequiredService()); - - implType - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(aggrgateInstance, (ILogger)c.GetService(loggerType)); - - return aggrgateInstance; - }); - } - - return config; - } - - /// - /// Registers all sagas that implement the ISaga interface in the IoC container. - /// When factory is not provided, uses default constructor to create saga instances. - /// - /// - /// Factory to return saga instances by given type. - /// - /// - public static ISourceFlowConfig WithSagas(this ISourceFlowConfig config, Func sagaFactory = null) - { - var interfaceType = typeof(ISaga); - var implementationTypes = GetTypesFromAssemblies(interfaceType); - - foreach (var implType in implementationTypes) - { - var sagaInstance = sagaFactory != null - ? sagaFactory(implType) - : (ISaga)Activator.CreateInstance(implType); - - if (sagaInstance == null) - throw new InvalidOperationException($"Saga registration for {implType.Name} returned null."); - - var loggerType = typeof(ILogger<>).MakeGenericType(implType); - - var interfaces = implType.GetInterfaces(); - - var index = 1; - - foreach (var intrface in interfaces) - ((SourceFlowConfig)config).Services.AddSingleton(intrface, c => + // Handle cases where some types can't be loaded + return a.GetTypes() + .Where(t => t != null && + interfaceType.IsAssignableFrom(t) && + t.IsClass && + !t.IsAbstract && + !t.IsGenericType && + !t.ContainsGenericParameters); + } + catch { - implType - .GetField("commandPublisher", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(sagaInstance, c.GetRequiredService()); - - implType - .GetField("eventQueue", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(sagaInstance, c.GetRequiredService()); - - implType - .GetField("logger", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(sagaInstance, (ILogger)c.GetService(loggerType)); - - implType - .GetField("repository", BindingFlags.Instance | BindingFlags.NonPublic) - ?.SetValue(sagaInstance, c.GetRequiredService()); - - if (index == 1) - { - var dispatcher = c.GetRequiredService(); - dispatcher.Register(sagaInstance); - } - - index++; - - return sagaInstance; - }); - } - - return config; - } - - /// - /// Interface for SourceFlow configuration. - /// - public interface ISourceFlowConfig - { - } + return Array.Empty(); + } + }) + .Distinct(); - /// - /// Configuration class for SourceFlow. - /// - public class SourceFlowConfig : ISourceFlowConfig - { - /// - /// Service collection for SourceFlow configuration. - /// - public IServiceCollection Services { get; set; } + return implementationTypes; } } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/ICommandBus.cs b/src/SourceFlow/Messaging/Bus/ICommandBus.cs index 5738c2c..07a8f4d 100644 --- a/src/SourceFlow/Messaging/Bus/ICommandBus.cs +++ b/src/SourceFlow/Messaging/Bus/ICommandBus.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Messaging.Bus { @@ -23,10 +24,5 @@ Task Publish(TCommand command) /// Unique aggregate entity id. /// Task Replay(int aggregateId); - - /// - /// Represents command dispathers that can handle the publishing of commands. - /// - event EventHandler Dispatchers; } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/ICommandDispatcher.cs b/src/SourceFlow/Messaging/Bus/ICommandDispatcher.cs deleted file mode 100644 index 190aa90..0000000 --- a/src/SourceFlow/Messaging/Bus/ICommandDispatcher.cs +++ /dev/null @@ -1,20 +0,0 @@ -using SourceFlow.Saga; - -namespace SourceFlow.Messaging.Bus -{ - public interface ICommandDispatcher - { - /// - /// Registers a saga with the command bus. - /// - /// - void Register(ISaga saga); - - /// - /// Dispatches a command to the registered sagas. - /// - /// - /// - void Dispatch(object sender, ICommand command); - } -} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/ICommandReplayer.cs b/src/SourceFlow/Messaging/Bus/ICommandReplayer.cs deleted file mode 100644 index 7e6898d..0000000 --- a/src/SourceFlow/Messaging/Bus/ICommandReplayer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Threading.Tasks; - -namespace SourceFlow.Messaging.Bus -{ - /// - /// Interface for replaying commands in the event-driven architecture. - /// - public interface ICommandReplayer - { - /// - /// Replays all commands for a given aggregate. - /// - /// Unique aggregate entity id. - /// - Task Replay(int aggregateId); - } -} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/IEventDispatcher.cs b/src/SourceFlow/Messaging/Bus/IEventDispatcher.cs deleted file mode 100644 index 2d07cee..0000000 --- a/src/SourceFlow/Messaging/Bus/IEventDispatcher.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SourceFlow.Messaging.Bus -{ - public interface IEventDispatcher - { - void Dispatch(object sender, IEvent @event); - } -} \ No newline at end of file diff --git a/src/SourceFlow/Impl/CommandBus.cs b/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs similarity index 74% rename from src/SourceFlow/Impl/CommandBus.cs rename to src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs index 73db665..eaff959 100644 --- a/src/SourceFlow/Impl/CommandBus.cs +++ b/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs @@ -2,10 +2,10 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Messaging; using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; -namespace SourceFlow.Impl +namespace SourceFlow.Messaging.Bus.Impl { /// /// Command bus implementation that handles commands and events in an event-driven architecture. @@ -25,17 +25,18 @@ internal class CommandBus : ICommandBus /// /// Represents command dispathers that can handle the publishing of commands. /// - public event EventHandler Dispatchers; + public ICommandDispatcher commandDispatcher; /// /// Initializes a new instance of the class. /// /// /// - public CommandBus(ICommandStore commandStore, ILogger logger) + public CommandBus(ICommandDispatcher commandDispatcher, ICommandStore commandStore, ILogger logger) { - this.commandStore = commandStore; - this.logger = logger; + this.commandStore = commandStore ?? throw new ArgumentNullException(nameof(commandStore)); + this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + this.commandDispatcher = commandDispatcher ?? throw new ArgumentNullException(nameof(commandDispatcher)); } /// @@ -57,10 +58,10 @@ private async Task Dispatch(TCommand command) where TCommand : IComman { // 1. Set event sequence no. if (!((IMetadata)command).Metadata.IsReplay) - ((IMetadata)command).Metadata.SequenceNo = await commandStore.GetNextSequenceNo(command.Payload.Id); + ((IMetadata)command).Metadata.SequenceNo = await commandStore.GetNextSequenceNo(command.Entity.Id); // 2. Dispatch command to handlers. - Dispatchers?.Invoke(this, command); + await commandDispatcher.Dispatch(command); // 3. Log event. logger?.LogInformation("Action=Command_Dispatched, Command={Command}, Payload={Payload}, SequenceNo={No}, Saga={Saga}", @@ -75,18 +76,18 @@ private async Task Dispatch(TCommand command) where TCommand : IComman /// /// Replays commands for a given aggregate. /// - /// Unique aggregate entity id. + /// Unique aggregate entity id. /// - async Task ICommandBus.Replay(int aggregateId) + async Task ICommandBus.Replay(int entityId) { - var commands = await commandStore.Load(aggregateId); + var commands = await commandStore.Load(entityId); if (commands == null || !commands.Any()) return; foreach (var command in commands.ToList()) { - ((IMetadata)command).Metadata.IsReplay = true; + command.Metadata.IsReplay = true; await Dispatch(command); } } diff --git a/src/SourceFlow/Messaging/Command.cs b/src/SourceFlow/Messaging/Commands/Command.cs similarity index 60% rename from src/SourceFlow/Messaging/Command.cs rename to src/SourceFlow/Messaging/Commands/Command.cs index 2d93b8f..e2dcaf0 100644 --- a/src/SourceFlow/Messaging/Command.cs +++ b/src/SourceFlow/Messaging/Commands/Command.cs @@ -1,5 +1,6 @@ -namespace SourceFlow.Messaging -{ +namespace SourceFlow.Messaging.Commands +{ + /// /// Base class for command in the command-driven architecture. /// @@ -10,13 +11,25 @@ public abstract class Command : ICommand /// Initializes a new instance of the class with a new payload. /// /// - public Command(TPayload payload) + public Command(int entityId, TPayload payload) { Metadata = new Metadata(); Name = GetType().Name; Payload = payload; + Entity = new EntityRef { Id = entityId }; + } + /// + /// Initializes a new instance of the Command class with the specified entity state and payload. + /// + /// true to indicate that the associated entity is new or to be created; otherwise, false. + /// The payload data to associate with the command. + public Command(bool newEntity, TPayload payload) + { + Metadata = new Metadata(); + Name = GetType().Name; + Payload = payload; + Entity = new EntityRef { Id = 0, IsNew= newEntity }; } - /// /// Metadata associated with the command, which includes information such as event ID, occurrence time, and sequence number. /// @@ -32,6 +45,11 @@ public Command(TPayload payload) /// public TPayload Payload { get; set; } + /// + /// Entity reference associated with the command. + /// + public EntityRef Entity { get; set; } + /// /// Payload of the command, containing the data associated with the command. /// @@ -43,5 +61,7 @@ IPayload ICommand.Payload Payload = (TPayload)value; } } + + } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Commands/ICommand.cs b/src/SourceFlow/Messaging/Commands/ICommand.cs new file mode 100644 index 0000000..3a094ce --- /dev/null +++ b/src/SourceFlow/Messaging/Commands/ICommand.cs @@ -0,0 +1,26 @@ +namespace SourceFlow.Messaging.Commands +{ + /// + /// Interface for commands in the event-driven architecture. + /// + public interface ICommand : IName, IMetadata + { + /// + /// Payload of the command, which is an entity that contains the data associated with the command. + /// + IPayload Payload { get; set; } + /// + /// Reference to the entity associated with the command. + /// + EntityRef Entity { get; set; } + } + + /// + /// Reference to an entity in the event-driven architecture. + /// + public class EntityRef : IEntity + { + public int Id { get; set; } + public bool IsNew { get; set; } + } +} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs b/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs new file mode 100644 index 0000000..67d4071 --- /dev/null +++ b/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using SourceFlow.Saga; + +namespace SourceFlow.Messaging.Commands +{ + public interface ICommandDispatcher + { + /// + /// Dispatches a command to the registered sagas. + /// + /// + Task Dispatch(ICommand command); + } +} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/ICommandPublisher.cs b/src/SourceFlow/Messaging/Commands/ICommandPublisher.cs similarity index 66% rename from src/SourceFlow/Messaging/Bus/ICommandPublisher.cs rename to src/SourceFlow/Messaging/Commands/ICommandPublisher.cs index b288acd..d3f3b71 100644 --- a/src/SourceFlow/Messaging/Bus/ICommandPublisher.cs +++ b/src/SourceFlow/Messaging/Commands/ICommandPublisher.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -namespace SourceFlow.Messaging.Bus +namespace SourceFlow.Messaging.Commands { /// /// Interface for publishing commands to bus in the event-driven architecture. @@ -15,5 +15,11 @@ public interface ICommandPublisher /// Task Publish(TCommand command) where TCommand : ICommand; + /// + /// Replays commands for the specified entity Id. + /// + /// + /// + Task ReplayCommands(int entityId); } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Commands/ICommandSubscriber.cs b/src/SourceFlow/Messaging/Commands/ICommandSubscriber.cs new file mode 100644 index 0000000..5f9246b --- /dev/null +++ b/src/SourceFlow/Messaging/Commands/ICommandSubscriber.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using SourceFlow.Saga; + +namespace SourceFlow.Messaging.Commands +{ + /// + /// Interface for subscribing commands in the event-driven architecture. + /// + public interface ICommandSubscriber + { + ///// + ///// Registers a saga with the command bus. + ///// + ///// + //void Register(ISaga saga); + + /// + /// Subscribes a command + /// + /// + /// + /// + Task Subscribe(TCommand command) + where TCommand : ICommand; + } +} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs b/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs new file mode 100644 index 0000000..0a07d84 --- /dev/null +++ b/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; + +namespace SourceFlow.Messaging.Commands.Impl +{ + /// + /// This dispatcher is responsible for dispatching commands to registered sagas in an event-driven architecture. + /// + internal class CommandDispatcher : ICommandDispatcher + { + /// + /// Collection of sagas registered with the dispatcher. + /// + private readonly IEnumerable commandSubscribers; + + /// + /// Logger for the command dispatcher to log events and errors. + /// + private readonly ILogger logger; + + /// + /// Initializes a new instance of the class with the specified logger. + /// + /// + /// + public CommandDispatcher(IEnumerable commandSubscribers, ILogger logger) + { + this.logger = logger; + this.commandSubscribers = commandSubscribers; + } + + /// + /// Dispatches a command to all sagas that are registered with the command dispatcher. + /// + /// + /// + public Task Dispatch(ICommand command) + { + return Send(command); + } + + /// + /// Publishes a command to all sagas that are registered with the command dispatcher. + /// + /// + /// + /// + private Task Send(TCommand command) where TCommand : ICommand + { + if (!commandSubscribers.Any()) + { + logger?.LogInformation("Action=Command_Dispatcher, Command={Command}, Payload={Payload}, SequenceNo={No}, Message=No subscribers Found", + command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo); + + return Task.CompletedTask; + } + + var tasks = new List(); + + foreach (var subscriber in commandSubscribers) + tasks.Add(subscriber.Subscribe(command)); + + + return Task.WhenAll(tasks); + } + } +} \ No newline at end of file diff --git a/src/SourceFlow/Impl/CommandPublisher.cs b/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs similarity index 69% rename from src/SourceFlow/Impl/CommandPublisher.cs rename to src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs index 08e2daf..9b2da45 100644 --- a/src/SourceFlow/Impl/CommandPublisher.cs +++ b/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using SourceFlow.Messaging.Bus; -namespace SourceFlow.Impl +namespace SourceFlow.Messaging.Commands.Impl { /// /// Implementation of the ICommandPublisher interface for publishing commands to bus. @@ -23,6 +23,16 @@ public CommandPublisher(ICommandBus commandBus) this.commandBus = commandBus; } + /// + /// Replays commands for a specific entity by its Id. + /// + /// + /// + public Task ReplayCommands(int entityId) + { + return commandBus.Replay(entityId); + } + /// /// Publishes a command to the command bus. /// @@ -36,8 +46,11 @@ async Task ICommandPublisher.Publish(TCommand command) if (command == null) throw new ArgumentNullException(nameof(command)); - if (command.Payload?.Id == null) - throw new InvalidOperationException(nameof(command) + "requires payload entity with id"); + if (command.Entity == null) + throw new InvalidOperationException(nameof(command) + " requires entity reference."); + + if (!command.Entity.IsNew && command.Entity?.Id == null) + throw new InvalidOperationException(nameof(command) + " requires entity id when not new entity."); await commandBus.Publish(command); } diff --git a/src/SourceFlow/Messaging/Event.cs b/src/SourceFlow/Messaging/Events/Event.cs similarity index 85% rename from src/SourceFlow/Messaging/Event.cs rename to src/SourceFlow/Messaging/Events/Event.cs index bfadcb8..d0ce644 100644 --- a/src/SourceFlow/Messaging/Event.cs +++ b/src/SourceFlow/Messaging/Events/Event.cs @@ -1,6 +1,4 @@ -using SourceFlow.Aggregate; - -namespace SourceFlow.Messaging +namespace SourceFlow.Messaging.Events { /// /// Base class for implementing events in an event-driven architecture. @@ -10,14 +8,14 @@ public abstract class Event : IEvent where TEntity : IEntity { /// - /// Initializes a new instance of the class with a specified payload. + /// Initializes a new instance of the class with a specified entity. /// - /// - public Event(TEntity payload) + /// + public Event(TEntity entity) { Metadata = new Metadata(); Name = GetType().Name; - Payload = payload; + Payload = entity; } /// diff --git a/src/SourceFlow/Messaging/IEvent.cs b/src/SourceFlow/Messaging/Events/IEvent.cs similarity index 81% rename from src/SourceFlow/Messaging/IEvent.cs rename to src/SourceFlow/Messaging/Events/IEvent.cs index a4243a1..0dbdc4a 100644 --- a/src/SourceFlow/Messaging/IEvent.cs +++ b/src/SourceFlow/Messaging/Events/IEvent.cs @@ -1,6 +1,4 @@ -using SourceFlow.Aggregate; - -namespace SourceFlow.Messaging +namespace SourceFlow.Messaging.Events { public interface IEvent : IName, IMetadata diff --git a/src/SourceFlow/Messaging/Events/IEventDispatcher.cs b/src/SourceFlow/Messaging/Events/IEventDispatcher.cs new file mode 100644 index 0000000..b2ea46d --- /dev/null +++ b/src/SourceFlow/Messaging/Events/IEventDispatcher.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace SourceFlow.Messaging.Events +{ + public interface IEventDispatcher + { + Task Dispatch(IEvent @event); + } +} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Bus/IEventQueue.cs b/src/SourceFlow/Messaging/Events/IEventQueue.cs similarity index 63% rename from src/SourceFlow/Messaging/Bus/IEventQueue.cs rename to src/SourceFlow/Messaging/Events/IEventQueue.cs index c1dd570..e29eec7 100644 --- a/src/SourceFlow/Messaging/Bus/IEventQueue.cs +++ b/src/SourceFlow/Messaging/Events/IEventQueue.cs @@ -1,15 +1,10 @@ using System; using System.Threading.Tasks; -namespace SourceFlow.Messaging.Bus +namespace SourceFlow.Messaging.Events { public interface IEventQueue { - /// - /// Dispatchers that are invoked to publish an event that is dequeued from the event queue. - /// - event EventHandler Dispatchers; - /// /// Enqueues an event in order to publish to subcribers. /// diff --git a/src/SourceFlow/Messaging/Events/IEventSubscriber.cs b/src/SourceFlow/Messaging/Events/IEventSubscriber.cs new file mode 100644 index 0000000..9d5623b --- /dev/null +++ b/src/SourceFlow/Messaging/Events/IEventSubscriber.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; + +namespace SourceFlow.Messaging.Events +{ + /// + /// Defines a contract for subscribing to events within the event-driven architecture. + /// + public interface IEventSubscriber + { + /// + /// Subscribes to the specified event. + /// + /// + /// + /// + Task Subscribe(TEvent @event) where TEvent : IEvent; + } +} diff --git a/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs b/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs new file mode 100644 index 0000000..5a3e3d3 --- /dev/null +++ b/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +namespace SourceFlow.Messaging.Events.Impl +{ + internal class EventDispatcher : IEventDispatcher + { + /// + /// Represents a collection of subscribers interested in the event. + /// + /// This collection contains instances of objects implementing the interface. Each subscribers in the collection subscribes to events of interest. + private IEnumerable subscribers; + + /// + /// Logger for the event queue to log events and errors. + /// + private readonly ILogger logger; + + /// + /// Initializes a new instance of the class with the specified subscribers and logger. + /// + /// + /// + /// + public EventDispatcher(IEnumerable subscribers, ILogger logger) + { + this.subscribers = subscribers ?? throw new ArgumentNullException(nameof(subscribers)); + this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + /// + /// Dispatch the event to all subscribers that can handle it. + /// + /// + /// + /// + public Task Dispatch(IEvent @event) + { + var tasks = new List(); + + foreach (var subscriber in subscribers) + { + tasks.Add(subscriber.Subscribe(@event)); + + logger?.LogInformation("Action=Event_Dispatcher, Event={Event}, Subscriber:{subscriber}", + @event.Name, subscribers.GetType().Name); + } + + if (!tasks.Any()) + return Task.CompletedTask; + + return Task.WhenAll(tasks); + } + } +} \ No newline at end of file diff --git a/src/SourceFlow/Impl/EventQueue.cs b/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs similarity index 76% rename from src/SourceFlow/Impl/EventQueue.cs rename to src/SourceFlow/Messaging/Events/Impl/EventQueue.cs index 5c656de..54f6b00 100644 --- a/src/SourceFlow/Impl/EventQueue.cs +++ b/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs @@ -1,10 +1,8 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; -namespace SourceFlow.Impl +namespace SourceFlow.Messaging.Events.Impl { /// /// EventQueue is responsible for managing the flow of events in an event-driven architecture. @@ -17,21 +15,22 @@ internal class EventQueue : IEventQueue private readonly ILogger logger; /// - /// Represents event dispathers that can handle the dequeuing of events. + /// Represents event dispather that can handle the dequeuing of events. /// - public event EventHandler Dispatchers; + public IEventDispatcher eventDispatcher; /// /// Initializes a new instance of the class with the specified logger. /// /// /// - public EventQueue(ILogger logger) + public EventQueue(IEventDispatcher eventDispatcher, ILogger logger) { this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + this.eventDispatcher = eventDispatcher ?? throw new ArgumentNullException(nameof(eventDispatcher)); } - /// + /// /// Enqueues an event in order to publish to subcribers. /// /// @@ -43,7 +42,7 @@ public async Task Enqueue(TEvent @event) if (@event == null) throw new ArgumentNullException(nameof(@event)); - Dispatchers?.Invoke(this, @event); + await eventDispatcher.Dispatch(@event); logger?.LogInformation("Action=Event_Enqueue, Event={Event}, Payload={Payload}", @event.GetType().Name, @event.Payload.GetType().Name); diff --git a/src/SourceFlow/Messaging/ICommand.cs b/src/SourceFlow/Messaging/ICommand.cs deleted file mode 100644 index 167a58d..0000000 --- a/src/SourceFlow/Messaging/ICommand.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace SourceFlow.Messaging -{ - /// - /// Interface for commands in the event-driven architecture. - /// - public interface ICommand : IName, IMetadata - { - /// - /// Payload of the command, which is an entity that contains the data associated with the command. - /// - IPayload Payload { get; set; } - } -} \ No newline at end of file diff --git a/src/SourceFlow/Messaging/IPayload.cs b/src/SourceFlow/Messaging/IPayload.cs index 1336e86..df9f2bd 100644 --- a/src/SourceFlow/Messaging/IPayload.cs +++ b/src/SourceFlow/Messaging/IPayload.cs @@ -5,9 +5,6 @@ namespace SourceFlow.Messaging /// public interface IPayload { - /// - /// Unique identifier for the Aggregate. - /// - int Id { get; set; } + } } \ No newline at end of file diff --git a/src/SourceFlow/Impl/ProjectionDispatcher.cs b/src/SourceFlow/Projections/EventSubscriber.cs similarity index 64% rename from src/SourceFlow/Impl/ProjectionDispatcher.cs rename to src/SourceFlow/Projections/EventSubscriber.cs index 4c314eb..d23be6d 100644 --- a/src/SourceFlow/Impl/ProjectionDispatcher.cs +++ b/src/SourceFlow/Projections/EventSubscriber.cs @@ -3,16 +3,14 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; -using SourceFlow.Projections; +using SourceFlow.Messaging.Events; -namespace SourceFlow.Impl +namespace SourceFlow.Projections { /// - /// This dispatcher is responsible for dispatching events to the appropriate view projections. + /// This subscriber is responsible for subsribing events to apply view projections. /// - internal class ProjectionDispatcher : IEventDispatcher + internal class EventSubscriber : IEventSubscriber { /// /// Represents a collection of view transforms used to modify or manipulate views. @@ -25,51 +23,39 @@ internal class ProjectionDispatcher : IEventDispatcher /// /// Logger for the event queue to log events and errors. /// - private readonly ILogger logger; + private readonly ILogger logger; /// - /// Initializes a new instance of the class with the specified projections and logger. + /// Initializes a new instance of the class with the specified projections and logger. /// /// /// /// - public ProjectionDispatcher(IEnumerable projections, ILogger logger) + public EventSubscriber(IEnumerable projections, ILogger logger) { this.projections = projections ?? throw new ArgumentNullException(nameof(projections)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - /// - /// Dispatches the event to all view projections that can handle it. - /// - /// - /// - public void Dispatch(object sender, IEvent @event) - { - Dispatch(@event).GetAwaiter().GetResult(); - logger?.LogInformation("Action=Event_Dispatcher_Complete, Event={Event}, Sender:{sender}", - @event.Name, sender.GetType().Name); - } - /// /// Dispatch the event to all view projections that can handle it. /// /// /// /// - public async Task Dispatch(TEvent @event) + public async Task Subscribe(TEvent @event) where TEvent : IEvent { var tasks = new List(); foreach (var projection in projections) { - var projectionType = typeof(IProjectOn<>).MakeGenericType(@event.GetType()); + var projectionType = typeof(IProjectOn<>).MakeGenericType(typeof(TEvent)); if (!projectionType.IsAssignableFrom(projection.GetType())) continue; var method = typeof(IProjectOn<>) - .MakeGenericType(@event.GetType()) + .MakeGenericType(typeof(TEvent)) .GetMethod(nameof(IProjectOn.Apply)); var task = (Task)method.Invoke(projection, new object[] { @event }); diff --git a/src/SourceFlow/Projections/IProjection.cs b/src/SourceFlow/Projections/IProjection.cs index 6dbd344..e3dd4da 100644 --- a/src/SourceFlow/Projections/IProjection.cs +++ b/src/SourceFlow/Projections/IProjection.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Projections { diff --git a/src/SourceFlow/Impl/SagaDispatcher.cs b/src/SourceFlow/Saga/CommandSubscriber.cs similarity index 67% rename from src/SourceFlow/Impl/SagaDispatcher.cs rename to src/SourceFlow/Saga/CommandSubscriber.cs index a64fa6c..b186f58 100644 --- a/src/SourceFlow/Impl/SagaDispatcher.cs +++ b/src/SourceFlow/Saga/CommandSubscriber.cs @@ -2,55 +2,44 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Aggregate; using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; -using SourceFlow.Saga; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Commands.Impl; -namespace SourceFlow.Impl +namespace SourceFlow.Saga { /// /// This dispatcher is responsible for dispatching commands to registered sagas in an event-driven architecture. /// - internal class SagaDispatcher : ICommandDispatcher + internal class CommandSubscriber : ICommandSubscriber { /// /// Collection of sagas registered with the dispatcher. /// - private readonly ICollection sagas; + private readonly IEnumerable sagas; /// /// Logger for the command dispatcher to log events and errors. /// - private readonly ILogger logger; + private readonly ILogger logger; /// - /// Initializes a new instance of the class with the specified logger. + /// Initializes a new instance of the class with the specified logger. /// /// - public SagaDispatcher(ILogger logger) + public CommandSubscriber(IEnumerable sagas, ILogger logger) { this.logger = logger; - sagas = new List(); + this.sagas = sagas; } - /// - /// Dispatches a command to all sagas that are registered with the command dispatcher. - /// - /// - /// - public void Dispatch(object sender, ICommand command) - { - Send(command).GetAwaiter().GetResult(); - } - - /// + /// /// Publishes a command to all sagas that are registered with the command dispatcher. /// /// /// /// - private async Task Send(TCommand command) where TCommand : ICommand + public async Task Subscribe(TCommand command) where TCommand : ICommand { if (!sagas.Any()) { @@ -89,13 +78,13 @@ private async Task Send(ISaga saga, TCommand command) where TCommand : await saga.Handle(command); } - /// - /// Registers a saga with the dispatcher. - /// - /// - public void Register(ISaga saga) - { - sagas.Add(saga); - } + ///// + ///// Registers a saga with the dispatcher. + ///// + ///// + //public void Register(ISaga saga) + //{ + // sagas.Add(saga); + //} } } \ No newline at end of file diff --git a/src/SourceFlow/Saga/IHandles.cs b/src/SourceFlow/Saga/IHandles.cs index 65c8d72..dd7833f 100644 --- a/src/SourceFlow/Saga/IHandles.cs +++ b/src/SourceFlow/Saga/IHandles.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; namespace SourceFlow.Saga { @@ -11,10 +12,11 @@ public interface IHandles where TCommand : ICommand { /// - /// Handles the specified command. + /// Handles the specified command against entity. /// + /// /// /// - Task Handle(TCommand command); + Task Handle(IEntity entity, TCommand command); } } \ No newline at end of file diff --git a/src/SourceFlow/Saga/IHandlesWithEvent.cs b/src/SourceFlow/Saga/IHandlesWithEvent.cs new file mode 100644 index 0000000..86956b6 --- /dev/null +++ b/src/SourceFlow/Saga/IHandlesWithEvent.cs @@ -0,0 +1,17 @@ +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; + +namespace SourceFlow.Saga +{ + /// + /// Interface for handling command and producing event in the event-driven saga. + /// + /// Handle the Command of type TCommand. + /// Raises event of type TEvent upon success. + public interface IHandlesWithEvent: IHandles + where TCommand : ICommand + where TEvent : IEvent + { + + } +} \ No newline at end of file diff --git a/src/SourceFlow/Saga/ISaga.cs b/src/SourceFlow/Saga/ISaga.cs index bdbb108..d9569fa 100644 --- a/src/SourceFlow/Saga/ISaga.cs +++ b/src/SourceFlow/Saga/ISaga.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; -using SourceFlow.Aggregate; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Saga { diff --git a/src/SourceFlow/Saga/Saga.cs b/src/SourceFlow/Saga/Saga.cs index a5d284f..9608a50 100644 --- a/src/SourceFlow/Saga/Saga.cs +++ b/src/SourceFlow/Saga/Saga.cs @@ -1,9 +1,11 @@ using System; +using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using SourceFlow.Aggregate; using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; namespace SourceFlow.Saga { @@ -37,28 +39,32 @@ public abstract class Saga : ISaga /// /// Logger for the saga to log events and errors. /// - protected ILogger logger; + protected ILogger logger; /// /// Initializes a new instance of the class. /// - protected Saga() + public Saga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) { + this.commandPublisher = commandPublisher ?? throw new ArgumentNullException(nameof(commandPublisher)); + this.eventQueue = eventQueue ?? throw new ArgumentNullException(nameof(eventQueue)); + this.repository = repository ?? throw new ArgumentNullException(nameof(repository)); + this.logger = logger; } /// /// Determines whether the specified saga instance can handle the given event type. /// /// The saga instance to evaluate. Must not be . - /// The type of the event to check. Must not be . + /// The type of the command to check. Must not be . /// if the saga instance can handle the specified event type; otherwise, . - internal static bool CanHandle(ISaga instance, Type eventType) + internal static bool CanHandle(ISaga instance, Type commandType) { - if (instance == null || eventType == null) + if (instance == null || commandType == null) return false; - var handlerType = typeof(IHandles<>).MakeGenericType(eventType); + var handlerType = typeof(IHandles<>).MakeGenericType(commandType); return handlerType.IsAssignableFrom(instance.GetType()); } @@ -73,26 +79,102 @@ internal static bool CanHandle(ISaga instance, Type eventType) /// async Task ISaga.Handle(TCommand command) { - if (!CanHandle(this, command.GetType())) + + if (!(this is IHandles handles)) return; - var method = typeof(IHandles<>) - .MakeGenericType(command.GetType()) - .GetMethod(nameof(IHandles.Handle)); + TAggregate entity; + if (command.Entity.IsNew) + entity = InitialiseEntity(command.Entity.Id); + else + entity = await repository.Get(command.Entity.Id); + + await handles.Handle(entity, command); + + logger?.LogInformation("Action=Saga_Handled, Command={Command}, Payload={Payload}, SequenceNo={No}, Saga={Saga}", + command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo, GetType().Name); + + if (entity != null) + await repository.Persist(entity); + + await RaiseEvent(command, entity); + } - var task = (Task)method.Invoke(this, new object[] { command }); + private async Task RaiseEvent(TCommand command, TAggregate entity) where TCommand : ICommand + { + try + { + var handlesWithEventInterface = this.GetType() + .GetInterfaces() + .FirstOrDefault(i => + i.IsGenericType && + i.GetGenericTypeDefinition() == typeof(IHandlesWithEvent<,>) && + i.GetGenericArguments()[0].IsAssignableFrom(typeof(TCommand)) + ); + + if (handlesWithEventInterface != null) + { + var eventType = handlesWithEventInterface.GetGenericArguments()[1]; + + object eventInstance = null; + + // Try parameterless constructor first + try + { + eventInstance = Activator.CreateInstance(eventType); + } + catch + { + // Try constructor that accepts the aggregate/entity payload + var ctor = eventType.GetConstructors() + .FirstOrDefault(c => + { + var ps = c.GetParameters(); + return ps.Length == 1 && ps[0].ParameterType.IsAssignableFrom(entity.GetType()); + }); + + if (ctor != null) + { + eventInstance = ctor.Invoke(new object[] { entity }); + } + } + + if (eventInstance is IEvent ev) + { + // Ensure payload set + if (ev.Payload == null && entity != null) + ev.Payload = entity; + + await Raise(ev); + } + } + } + catch (Exception ex) + { + // Don't break saga processing if raising event fails; log the error. + logger?.LogError(ex, "Action=Saga_RaiseEventFailed, Saga={Saga}, Command={Command}", GetType().Name, command.GetType().Name); + } + } - logger?.LogInformation("Action=Saga_Handled, Command={Command}, Payload={Payload}, SequenceNo={No}, Saga={Saga}, Handler:{Handler}", - command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo, GetType().Name, method.Name); - await Task.Run(() => task); + /// + /// Initialises a new instance of the aggregate entity with the specified ID. + /// + /// + /// + /// + private TAggregate InitialiseEntity(int id) + { + var entity = Activator.CreateInstance(typeof(TAggregate), true); + ((IEntity)entity).Id = id; + return (TAggregate)entity; } /// /// Publishes the specified command to the command bus. /// /// If the does not have an entity type specified, it will be - /// automatically set to the type of TAggregate. + /// automatically set to the type of TEntity. /// The type of the command to publish. Must implement . /// The command to be published. Cannot be . /// A task that represents the asynchronous operation of publishing the command. @@ -105,8 +187,8 @@ protected Task Publish(TCommand command) if (command == null) throw new ArgumentNullException(nameof(command)); - if (command.Payload?.Id == null) - throw new InvalidOperationException(nameof(command) + "requires source entity id"); + if (command.Entity?.Id == null) + throw new InvalidOperationException(nameof(command) + "requires entity reference with id"); return commandPublisher.Publish(command); } diff --git a/src/SourceFlow/Services/IService.cs b/src/SourceFlow/Services/IService.cs deleted file mode 100644 index 0c4fe13..0000000 --- a/src/SourceFlow/Services/IService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Threading.Tasks; -using SourceFlow.Aggregate; - -namespace SourceFlow.Services -{ - /// - /// Interface for the service layer in the event-driven architecture. - /// - public interface IService - { - /// - /// Creates an initialised aggregate root instance. - /// - /// - /// - Task CreateAggregate() where TAggregateRoot : class, IAggregate; - } -} \ No newline at end of file diff --git a/src/SourceFlow/Services/Service.cs b/src/SourceFlow/Services/Service.cs deleted file mode 100644 index befcdc1..0000000 --- a/src/SourceFlow/Services/Service.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using SourceFlow.Aggregate; - -namespace SourceFlow.Services -{ - /// - /// Base class for services in the event-driven architecture. - /// - public abstract class Service : IService - { - /// - /// Factory for creating aggregate roots. - /// - protected IAggregateFactory aggregateFactory; - - /// - /// Logger for the service to log events and errors. - /// - protected ILogger logger; - - /// - /// Creates an initialised aggregate root. - /// - /// - /// Implementation of IAggregate - public async Task CreateAggregate() where TAggregate : class, IAggregate - { - var aggregate = await aggregateFactory.Create(); - return aggregate; - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs b/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs index b925e26..b400a19 100644 --- a/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs +++ b/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs @@ -1,81 +1,110 @@ +using System; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Moq; +using NUnit.Framework; using SourceFlow.Aggregate; +using SourceFlow.Core.Tests.Impl; using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.Aggregates { [TestFixture] public class AggregateTests { - public class DummyEntity : IEntity - { public int Id { get; set; } } + private Mock commandPublisherMock; + private Mock> loggerMock; + private TestAggregate aggregate; - public class TestAggregate : Aggregate + [SetUp] + public void Setup() { - public TestAggregate() : this(new Mock().Object, new Mock().Object, new Mock().Object) - { - } + commandPublisherMock = new Mock(); + loggerMock = new Mock>(); + aggregate = new TestAggregate(commandPublisherMock.Object, loggerMock.Object); + } - public TestAggregate(ICommandPublisher publisher, ICommandReplayer replayer, ILogger logger) - { - commandPublisher = publisher; - commandReplayer = replayer; - this.logger = logger; - } + [Test] + public void Constructor_SetsCommandPublisher() + { + // Assert + Assert.That(aggregate.GetCommandPublisher(), Is.EqualTo(commandPublisherMock.Object)); + } - public Task TestSend(ICommand command) => Send(command); + [Test] + public void Constructor_SetsLogger() + { + // Assert + Assert.That(aggregate.GetLogger(), Is.EqualTo(loggerMock.Object)); } [Test] - public async Task Replay_DelegatesToCommandReplayer() + public async Task ReplayCommands_DelegatesToCommandPublisher() { - var publisher = new Mock().Object; - var replayerMock = new Mock(); - replayerMock.Setup(r => r.Replay(It.IsAny())).Returns(Task.CompletedTask); - var logger = new Mock().Object; - var aggregate = new TestAggregate(publisher, replayerMock.Object, logger); - await aggregate.Replay(42); - replayerMock.Verify(r => r.Replay(42), Times.Once); + // Arrange + var entityId = 42; + + // Act + await aggregate.ReplayCommands(entityId); + + // Assert + commandPublisherMock.Verify(cp => cp.ReplayCommands(entityId), Times.Once); } [Test] - public void Send_NullCommand_ThrowsArgumentNullException() + public async Task Send_ValidCommand_DelegatesToCommandPublisher() { - var publisher = new Mock().Object; - var replayer = new Mock().Object; - var logger = new Mock().Object; - var aggregate = new TestAggregate(publisher, replayer, logger); - Assert.ThrowsAsync(async () => await aggregate.TestSend(null)); + // Arrange + var command = new DummyCommand(); + + // Act + await aggregate.SendCommand(command); + + // Assert + commandPublisherMock.Verify(cp => cp.Publish(It.IsAny()), Times.Once); } [Test] - public void Send_NullPayload_ThrowsInvalidOperationException() + public async Task Send_NullCommand_ThrowsArgumentNullException() { - var publisher = new Mock().Object; - var replayer = new Mock().Object; - var logger = new Mock().Object; - var aggregate = new TestAggregate(publisher, replayer, logger); - var commandMock = new Mock(); - commandMock.Setup(c => c.Payload).Returns((IPayload)null); - Assert.ThrowsAsync(async () => await aggregate.TestSend(commandMock.Object)); + // Assert + Assert.ThrowsAsync(async () => + await aggregate.SendCommand(null!)); } [Test] - public async Task Send_ValidCommand_DelegatesToPublisher() + public async Task Send_NullPayload_PublishesCommand() + { + // Arrange + var command = new DummyCommand { Payload = null! }; + + // This should delegate to publisher (no validation in Send method) + await aggregate.SendCommand(command); + + // Assert + commandPublisherMock.Verify(cp => cp.Publish(It.IsAny()), Times.Once); + } + + // Test aggregate concrete implementation + private class TestAggregate : Aggregate + { + public TestAggregate(ICommandPublisher commandPublisher, ILogger logger) + : base(commandPublisher, logger) + { + } + + // Expose protected members for testing + public ICommandPublisher GetCommandPublisher() => commandPublisher; + public ILogger GetLogger() => logger; + + // Expose Send method for testing + public Task SendCommand(ICommand command) => Send(command); + } + + private class TestEntity : IEntity { - var publisherMock = new Mock(); - publisherMock.Setup(p => p.Publish(It.IsAny())).Returns(Task.CompletedTask); - var replayer = new Mock().Object; - var logger = new Mock().Object; - var aggregate = new TestAggregate(publisherMock.Object, replayer, logger); - var payloadMock = new Mock(); - payloadMock.Setup(p => p.Id).Returns(1); - var commandMock = new Mock(); - commandMock.Setup(c => c.Payload).Returns(payloadMock.Object); - await aggregate.TestSend(commandMock.Object); - publisherMock.Verify(p => p.Publish(commandMock.Object), Times.Once); + public int Id { get; set; } = 1; } } -} \ No newline at end of file +} diff --git a/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs b/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs index 01dc2cd..4cb3a79 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs @@ -1,59 +1,69 @@ +using Microsoft.Extensions.Logging; using SourceFlow.Aggregate; using SourceFlow.Core.Tests.E2E.Commands; using SourceFlow.Core.Tests.E2E.Events; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Aggregates { public class AccountAggregate : Aggregate, - ISubscribes - + ISubscribes, IAccountAggregate { - public void CreateAccount(int accountId, string holder, decimal amount) + public AccountAggregate(ICommandPublisher commandPublisher, ILogger logger) : + base(commandPublisher, logger) { - Send(new CreateAccount(new Payload + } + + public Task CreateAccount(int accountId, string holder, decimal amount) + { + var command = new CreateAccount(new Payload { - Id = accountId, AccountName = holder, InitialAmount = amount - })); + }); + + command.Entity.Id = accountId; + + return Send(command); } - public void Deposit(int accountId, decimal amount) + public Task Deposit(int accountId, decimal amount) { - Send(new DepositMoney(new TransactPayload + return Send(new DepositMoney(accountId, new TransactPayload { - Id = accountId, Amount = amount, Type = TransactionType.Deposit })); } - public void Withdraw(int accountId, decimal amount) + public Task Withdraw(int accountId, decimal amount) { - Send(new WithdrawMoney(new TransactPayload + return Send(new WithdrawMoney(accountId, new TransactPayload { - Id = accountId, Amount = amount, Type = TransactionType.Withdrawal })); } - public void Close(int accountId, string reason) + public Task CloseAccount(int accountId, string reason) { - Send(new CloseAccount(new ClosurePayload + return Send(new CloseAccount(accountId, new ClosurePayload { - Id = accountId, ClosureReason = reason })); } public Task Handle(AccountCreated @event) { - return Send(new ActivateAccount(new ActivationPayload + return Send(new ActivateAccount(@event.Payload.Id, new ActivationPayload { - Id = @event.Payload.Id, ActiveOn = DateTime.UtcNow, })); } + + public Task RepayHistory(int accountId) + { + return ReplayCommands(accountId); + } } } \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/E2E/Aggregates/BankAccount.cs b/tests/SourceFlow.Core.Tests/E2E/Aggregates/BankAccount.cs index 591190d..9535cfb 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Aggregates/BankAccount.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Aggregates/BankAccount.cs @@ -1,5 +1,3 @@ -using SourceFlow.Aggregate; - namespace SourceFlow.Core.Tests.E2E.Aggregates { public class BankAccount : IEntity diff --git a/tests/SourceFlow.Core.Tests/E2E/Aggregates/IAccountAggregate.cs b/tests/SourceFlow.Core.Tests/E2E/Aggregates/IAccountAggregate.cs new file mode 100644 index 0000000..e9f0389 --- /dev/null +++ b/tests/SourceFlow.Core.Tests/E2E/Aggregates/IAccountAggregate.cs @@ -0,0 +1,14 @@ +using SourceFlow.Core.Tests.E2E.Events; + +namespace SourceFlow.Core.Tests.E2E.Aggregates +{ + public interface IAccountAggregate + { + Task CloseAccount(int accountId, string reason); + Task CreateAccount(int accountId, string holder, decimal amount); + Task Deposit(int accountId, decimal amount); + Task Handle(AccountCreated @event); + Task Withdraw(int accountId, decimal amount); + Task RepayHistory(int accountId); + } +} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/E2E/Commands/ActivateAccount.cs b/tests/SourceFlow.Core.Tests/E2E/Commands/ActivateAccount.cs index 4d895ce..6f2e994 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Commands/ActivateAccount.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Commands/ActivateAccount.cs @@ -1,10 +1,10 @@ -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Commands { public class ActivateAccount : Command { - public ActivateAccount(ActivationPayload payload) : base(payload) + public ActivateAccount(int entityId, ActivationPayload payload) : base(entityId, payload) { } } diff --git a/tests/SourceFlow.Core.Tests/E2E/Commands/CloseAccount.cs b/tests/SourceFlow.Core.Tests/E2E/Commands/CloseAccount.cs index 0d0adc1..36f1b85 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Commands/CloseAccount.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Commands/CloseAccount.cs @@ -1,10 +1,10 @@ -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Commands { public class CloseAccount : Command { - public CloseAccount(ClosurePayload payload) : base(payload) + public CloseAccount(int entityId, ClosurePayload payload) : base(entityId, payload) { } } diff --git a/tests/SourceFlow.Core.Tests/E2E/Commands/CreateAccount.cs b/tests/SourceFlow.Core.Tests/E2E/Commands/CreateAccount.cs index 186f5b3..d88b64e 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Commands/CreateAccount.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Commands/CreateAccount.cs @@ -1,10 +1,9 @@ -using SourceFlow.Messaging; - +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Commands { public class CreateAccount : Command { - public CreateAccount(Payload payload) : base(payload) + public CreateAccount(Payload payload) : base(true, payload) { } } diff --git a/tests/SourceFlow.Core.Tests/E2E/Commands/DepositMoney.cs b/tests/SourceFlow.Core.Tests/E2E/Commands/DepositMoney.cs index d6b83c5..ded5063 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Commands/DepositMoney.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Commands/DepositMoney.cs @@ -1,10 +1,11 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Commands { public class DepositMoney : Command { - public DepositMoney(TransactPayload payload) : base(payload) + public DepositMoney(int entityId, TransactPayload payload) : base(entityId, payload) { } } diff --git a/tests/SourceFlow.Core.Tests/E2E/Commands/WithdrawMoney.cs b/tests/SourceFlow.Core.Tests/E2E/Commands/WithdrawMoney.cs index 1dc64f4..e5809a7 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Commands/WithdrawMoney.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Commands/WithdrawMoney.cs @@ -1,10 +1,10 @@ -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Commands { public class WithdrawMoney : Command { - public WithdrawMoney(TransactPayload payload) : base(payload) + public WithdrawMoney(int entityId, TransactPayload payload) : base(entityId, payload) { } } diff --git a/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs b/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs index 47cf85c..9905a0e 100644 --- a/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs +++ b/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs @@ -1,9 +1,8 @@ +using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using SourceFlow.Core.Tests.E2E.Aggregates; using SourceFlow.Core.Tests.E2E.Projections; -using SourceFlow.Core.Tests.E2E.Sagas; -using SourceFlow.Core.Tests.E2E.Services; using SourceFlow.Saga; namespace SourceFlow.Core.Tests.E2E @@ -12,10 +11,11 @@ namespace SourceFlow.Core.Tests.E2E public class ProgramIntegrationTests { private ServiceProvider _serviceProvider; - private IAccountService _accountService; + private IAccountAggregate _accountAggregate; private ISaga _saga; private ILogger _logger; private IViewProvider _viewRepository; + private int _accountId = 999; [SetUp] public void SetUp() @@ -30,18 +30,12 @@ public void SetUp() }); // Register SourceFlow and all required services - services.UseSourceFlow( - configuration => - { - configuration - .WithAggregate() - .WithSaga() - .WithService(); - }); + // Pass the test assembly so it can discover E2E aggregates, sagas, and projections + services.UseSourceFlow(Assembly.GetExecutingAssembly()); _serviceProvider = services.BuildServiceProvider(); - _accountService = _serviceProvider.GetRequiredService(); + _accountAggregate = _serviceProvider.GetRequiredService(); _saga = _serviceProvider.GetRequiredService(); _logger = _serviceProvider.GetRequiredService>(); _viewRepository = _serviceProvider.GetRequiredService(); @@ -58,46 +52,46 @@ public void TearDown() public async Task EndToEnd_AccountLifecycle_WorksAsExpected() { // Create account - var accountId = await _accountService.CreateAccountAsync("John Doe", 1000m); - _logger.LogInformation("Action=Test_Create_Account, Account: {accountId}", accountId); + await _accountAggregate.CreateAccount(_accountId, "John Doe", 1000m); + _logger.LogInformation("Action=Test_Create_Account, Account: {accountId}", _accountId); // Perform deposit var amount = 500m; _logger.LogInformation("Action=Test_Deposit, Amount={Amount}", amount); - await _accountService.DepositAsync(accountId, amount); + await _accountAggregate.Deposit(_accountId, amount); // Perform withdraw amount = 200m; _logger.LogInformation("Action=Test_Withdraw, Amount={Amount}", amount); - await _accountService.WithdrawAsync(accountId, amount); + await _accountAggregate.Withdraw(_accountId, amount); // Perform another deposit amount = 100m; _logger.LogInformation("Action=Test_Deposit, Amount={Amount}", amount); - await _accountService.DepositAsync(accountId, amount); + await _accountAggregate.Deposit(_accountId, amount); // Find current state and assertions - var account = await _viewRepository.Find(accountId); + var account = await _viewRepository.Find(_accountId); Assert.That(account, Is.Not.Null); - Assert.That(accountId, Is.EqualTo(account.Id)); + Assert.That(_accountId, Is.EqualTo(account.Id)); Assert.That("John Doe", Is.EqualTo(account.AccountName)); Assert.That(1000m + 500m - 200m + 100m, Is.EqualTo(account.CurrentBalance)); Assert.That(account.TransactionCount, Is.GreaterThanOrEqualTo(3)); Assert.That(account.IsClosed, Is.False); // Replay account history (should not throw) - Assert.DoesNotThrowAsync(async () => await _accountService.ReplayHistoryAsync(accountId)); + Assert.DoesNotThrowAsync(async () => await _accountAggregate.RepayHistory(_accountId)); // Fetch state again, should be the same - var replayedAccount = await _viewRepository.Find(accountId); + var replayedAccount = await _viewRepository.Find(_accountId); Assert.That(account.CurrentBalance, Is.EqualTo(replayedAccount.CurrentBalance)); Assert.That(account.TransactionCount, Is.EqualTo(replayedAccount.TransactionCount)); - // Close account - Assert.DoesNotThrowAsync(async () => await _accountService.CloseAccountAsync(accountId, "Customer account close request")); + // CloseAccount account + Assert.DoesNotThrowAsync(async () => await _accountAggregate.CloseAccount(_accountId, "Customer account close request")); // Final state - var closedAccount = await _viewRepository.Find(accountId); + var closedAccount = await _viewRepository.Find(_accountId); Assert.That(closedAccount.IsClosed, Is.True); } } diff --git a/tests/SourceFlow.Core.Tests/E2E/Events/AccountCreated.cs b/tests/SourceFlow.Core.Tests/E2E/Events/AccountCreated.cs index e6eacaf..bf1c5ae 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Events/AccountCreated.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Events/AccountCreated.cs @@ -1,5 +1,5 @@ using SourceFlow.Core.Tests.E2E.Aggregates; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Core.Tests.E2E.Events { diff --git a/tests/SourceFlow.Core.Tests/E2E/Events/AccountUpdated.cs b/tests/SourceFlow.Core.Tests/E2E/Events/AccountUpdated.cs index d5ac968..65325d2 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Events/AccountUpdated.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Events/AccountUpdated.cs @@ -1,5 +1,5 @@ using SourceFlow.Core.Tests.E2E.Aggregates; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Core.Tests.E2E.Events { diff --git a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryEventStore.cs b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryEventStore.cs index 5aff60f..4710a4d 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryEventStore.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryEventStore.cs @@ -1,5 +1,6 @@ using System.Collections.Concurrent; using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.E2E.Impl { @@ -7,26 +8,26 @@ public class InMemoryEventStore : ICommandStore { private readonly ConcurrentDictionary> _store = new(); - public Task Append(ICommand @event) + public Task Append(ICommand command) { - if (!_store.ContainsKey(@event.Payload.Id)) - _store[@event.Payload.Id] = new List(); + if (!_store.ContainsKey(command.Entity.Id)) + _store[command.Entity.Id] = new List(); - _store[@event.Payload.Id].Add(@event); + _store[command.Entity.Id].Add(command); return Task.CompletedTask; } - public async Task> Load(int aggregateId) + public async Task> Load(int entityId) { - return await Task.FromResult(_store.TryGetValue(aggregateId, out var events) + return await Task.FromResult(_store.TryGetValue(entityId, out var events) ? events : Enumerable.Empty()); } - public Task GetNextSequenceNo(int aggregateId) + public Task GetNextSequenceNo(int entityId) { - if (_store.TryGetValue(aggregateId, out var events)) + if (_store.TryGetValue(entityId, out var events)) return Task.FromResult(events.Max(c => ((IMetadata)c).Metadata.SequenceNo) + 1); return Task.FromResult(1); diff --git a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryRepository.cs b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryRepository.cs index 2f75fc0..bc5cc5d 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryRepository.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryRepository.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using SourceFlow.Aggregate; namespace SourceFlow.Core.Tests.E2E.Impl { @@ -24,7 +23,10 @@ public Task Get(int id) where TEntity : class, IEntity var success = _cache.TryGetValue(id, out var entity); - return Task.FromResult(success ? (TEntity)entity : null); + if (!success || entity == null) + throw new InvalidOperationException($"Entity not found for ID: {id}"); + + return Task.FromResult((TEntity)entity); } public Task Persist(TEntity entity) where TEntity : IEntity diff --git a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryViewProvider.cs b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryViewProvider.cs index dfb6278..d7b5629 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryViewProvider.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Impl/InMemoryViewProvider.cs @@ -14,7 +14,10 @@ public Task Find(int id) where TViewModel : class, IView var success = _cache.TryGetValue(id, out var model); - return Task.FromResult(success ? (TViewModel)model : null); + if (!success || model == null) + throw new InvalidOperationException($"ViewModel not found for ID: {id}"); + + return Task.FromResult((TViewModel)model); } public Task Push(TViewModel model) where TViewModel : IViewModel diff --git a/tests/SourceFlow.Core.Tests/E2E/Projections/AccountView.cs b/tests/SourceFlow.Core.Tests/E2E/Projections/AccountView.cs index d467d9d..385051d 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Projections/AccountView.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Projections/AccountView.cs @@ -24,7 +24,7 @@ public async Task Apply(AccountCreated @event) CreatedDate = @event.Payload.CreatedOn, LastUpdated = DateTime.UtcNow, TransactionCount = 0, - ClosureReason = null, + ClosureReason = null!, Version = 1 }; @@ -35,9 +35,6 @@ public async Task Apply(AccountUpdated @event) { var view = await provider.Find(@event.Payload.Id); - if (view == null) - throw new InvalidOperationException($"Account view not found for ID: {@event.Payload.Id}"); - view.CurrentBalance = @event.Payload.Balance; view.LastUpdated = DateTime.UtcNow; view.AccountName = @event.Payload.AccountName; diff --git a/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs b/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs index b259636..eb1ce89 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs @@ -2,21 +2,28 @@ using SourceFlow.Core.Tests.E2E.Aggregates; using SourceFlow.Core.Tests.E2E.Commands; using SourceFlow.Core.Tests.E2E.Events; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; using SourceFlow.Saga; namespace SourceFlow.Core.Tests.E2E.Sagas { public class AccountSaga : Saga, - IHandles, - IHandles, - IHandles, - IHandles, - IHandles + IHandlesWithEvent, + IHandlesWithEvent, + IHandlesWithEvent, + IHandlesWithEvent, + IHandles { - public async Task Handle(CreateAccount command) + public AccountSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : + base(commandPublisher, eventQueue, repository, logger) + { + } + + public Task Handle(IEntity entity, CreateAccount command) { logger.LogInformation("Action=Account_Created, Account={AccountId}, Holder={AccountName}, Initial_Balance={InitialBalance}", - command.Payload.Id, command.Payload.AccountName, command.Payload.InitialAmount); + command.Entity.Id, command.Payload.AccountName, command.Payload.InitialAmount); if (string.IsNullOrEmpty(command.Payload.AccountName)) throw new ArgumentException("Account create requires account holder name.", nameof(command.Payload.AccountName)); @@ -24,85 +31,75 @@ public async Task Handle(CreateAccount command) if (command.Payload.InitialAmount <= 0) throw new ArgumentException("Account create requires initial amount.", nameof(command.Payload.InitialAmount)); - var account = new BankAccount - { - Id = command.Payload.Id, - AccountName = command.Payload.AccountName, - Balance = command.Payload.InitialAmount - }; + var account = (BankAccount)entity; - await repository.Persist(account); + account.AccountName = command.Payload.AccountName; + account.Balance = command.Payload.InitialAmount; - await Raise(new AccountCreated(account)); + return Task.CompletedTask; } - public async Task Handle(ActivateAccount command) + public Task Handle(IEntity entity, ActivateAccount command) { - logger.LogInformation("Action=Account_Activate, ActivatedOn={ActiveOn}, Account={AccountId}", command.Payload.ActiveOn, command.Payload.Id); + logger.LogInformation("Action=Account_Activate, ActivatedOn={ActiveOn}, Account={AccountId}", command.Payload.ActiveOn, command.Entity.Id); + + if (command.Payload.ActiveOn == DateTime.MinValue) + throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.ActiveOn)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot deposit to a closed account"); - if (command.Payload.ActiveOn == DateTime.MinValue) - throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.ActiveOn)); - account.ActiveOn = command.Payload.ActiveOn; - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); + return Task.CompletedTask; } - public async Task Handle(DepositMoney command) + public Task Handle(IEntity entity, DepositMoney command) { - logger.LogInformation("Action=Money_Deposited, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Payload.Id); + logger.LogInformation("Action=Money_Deposited, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Entity.Id); + + if (command.Payload.Amount <= 0) + throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot deposit to a closed account"); - if (command.Payload.Amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - command.Payload.CurrentBalance = account.Balance + command.Payload.Amount; account.Balance = command.Payload.CurrentBalance; - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); + return Task.CompletedTask; } - public async Task Handle(WithdrawMoney command) + public Task Handle(IEntity entity, WithdrawMoney command) { - logger.LogInformation("Action=Money_Withdrawn, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Payload.Id); + logger.LogInformation("Action=Money_Withdrawn, Amount={Amount}, Account={AccountId}", command.Payload.Amount, command.Entity.Id); + + if (command.Payload.Amount <= 0) + throw new ArgumentException("Withdrawal amount must be positive", nameof(command.Payload.Amount)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot deposit to a closed account"); - if (command.Payload.Amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(command.Payload.Amount)); - command.Payload.CurrentBalance = account.Balance - command.Payload.Amount; account.Balance = command.Payload.CurrentBalance; - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); + return Task.CompletedTask; } - public async Task Handle(CloseAccount command) + public Task Handle(IEntity entity, CloseAccount command) { - logger.LogInformation("Action=Account_Closed, Account={AccountId}, Reason={Reason}", command.Payload.Id, command.Payload.ClosureReason); + logger.LogInformation("Action=Account_Closed, Account={AccountId}, Reason={Reason}", command.Entity.Id, command.Payload.ClosureReason); if (string.IsNullOrWhiteSpace(command.Payload.ClosureReason)) throw new ArgumentException("Reason for closing cannot be empty", nameof(command.Payload.ClosureReason)); - var account = await repository.Get(command.Payload.Id); + var account = (BankAccount)entity; if (account.IsClosed) throw new InvalidOperationException("Cannot close account on a closed account"); @@ -110,9 +107,7 @@ public async Task Handle(CloseAccount command) account.ClosureReason = command.Payload.ClosureReason; account.IsClosed = command.Payload.IsClosed = true; - await repository.Persist(account); - - await Raise(new AccountUpdated(account)); + return Task.CompletedTask; } } } \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/E2E/Services/AccountService.cs b/tests/SourceFlow.Core.Tests/E2E/Services/AccountService.cs deleted file mode 100644 index 3b95d04..0000000 --- a/tests/SourceFlow.Core.Tests/E2E/Services/AccountService.cs +++ /dev/null @@ -1,78 +0,0 @@ -using SourceFlow.Core.Tests.E2E.Aggregates; -using SourceFlow.Services; - -namespace SourceFlow.Core.Tests.E2E.Services -{ - public class AccountService : Service, IAccountService - { - public async Task CreateAccountAsync(string accountHolderName, decimal initialBalance) - { - if (string.IsNullOrEmpty(accountHolderName)) - throw new ArgumentException("Account create requires account holder name.", nameof(accountHolderName)); - - if (initialBalance <= 0) - throw new ArgumentException("Account create requires initial amount.", nameof(initialBalance)); - - var account = await CreateAggregate(); - if (account == null) - throw new InvalidOperationException("Failed to create account aggregate"); - - var accountId = new Random().Next(); // Simulating a unique account ID generation - - account.CreateAccount(accountId, accountHolderName, initialBalance); - - return accountId; - } - - public async Task DepositAsync(int accountId, decimal amount) - { - if (accountId <= 0) - throw new ArgumentException("Deposit amount must need account id", nameof(amount)); - - if (amount <= 0) - throw new ArgumentException("Deposit amount must be positive", nameof(amount)); - - var account = await CreateAggregate(); - - account.Deposit(accountId, amount); - } - - public async Task WithdrawAsync(int accountId, decimal amount) - { - if (accountId <= 0) - throw new ArgumentException("Withdraw amount must need account id", nameof(amount)); - - if (amount <= 0) - throw new ArgumentException("Withdraw amount must be positive", nameof(amount)); - - var account = await CreateAggregate(); - if (account == null) - throw new InvalidOperationException("Failed to create account aggregate"); - - account.Withdraw(accountId, amount); - } - - public async Task CloseAccountAsync(int accountId, string reason) - { - if (accountId <= 0) - throw new ArgumentException("Close account requires valid account id", nameof(accountId)); - - if (string.IsNullOrEmpty(reason)) - throw new ArgumentException("Close account requires reason", nameof(reason)); - - var account = await CreateAggregate(); - - account.Close(accountId, reason); - } - - public async Task ReplayHistoryAsync(int accountId) - { - if (accountId <= 0) - throw new ArgumentException("Account history requires valid account id", nameof(accountId)); - - var account = await CreateAggregate(); - - await account.Replay(accountId); - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/E2E/Services/IAccountService.cs b/tests/SourceFlow.Core.Tests/E2E/Services/IAccountService.cs deleted file mode 100644 index d71273e..0000000 --- a/tests/SourceFlow.Core.Tests/E2E/Services/IAccountService.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace SourceFlow.Core.Tests.E2E.Services -{ - public interface IAccountService - { - Task CloseAccountAsync(int accountId, string reason); - - Task CreateAccountAsync(string accountHolderName, decimal initialBalance); - - Task DepositAsync(int accountId, decimal amount); - - Task WithdrawAsync(int accountId, decimal amount); - - Task ReplayHistoryAsync(int accountId); - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Impl/AggregateDispatcherTests.cs b/tests/SourceFlow.Core.Tests/Impl/AggregateSubscriberTests.cs similarity index 54% rename from tests/SourceFlow.Core.Tests/Impl/AggregateDispatcherTests.cs rename to tests/SourceFlow.Core.Tests/Impl/AggregateSubscriberTests.cs index c12ce1b..33a8dab 100644 --- a/tests/SourceFlow.Core.Tests/Impl/AggregateDispatcherTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/AggregateSubscriberTests.cs @@ -4,43 +4,46 @@ using Moq; using NUnit.Framework; using SourceFlow.Aggregate; -using SourceFlow.Impl; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Events; namespace SourceFlow.Core.Tests.Impl { [TestFixture] - public class AggregateDispatcherTests + public class AggregateSubscriberTests { [Test] public void Constructor_NullAggregates_ThrowsArgumentNullException() { - var loggerMock = new Mock>(); - Assert.Throws(() => new AggregateDispatcher(null, loggerMock.Object)); + var loggerMock = new Mock>(); + Assert.Throws(() => new Aggregate.EventSubscriber(null, loggerMock.Object)); } [Test] public void Constructor_NullLogger_ThrowsArgumentNullException() { var aggregates = new List(); - Assert.Throws(() => new AggregateDispatcher(aggregates, null)); + Assert.Throws(() => new Aggregate.EventSubscriber(aggregates, null)); } [Test] - public void Dispatch_ValidEvent_LogsInformation() + public async Task Dispatch_ValidEvent_LogsInformation() { - var loggerMock = new Mock>(); + var loggerMock = new Mock>(); var aggregateMock = new Mock(); + // Make the aggregate implement ISubscribes so it gets called + aggregateMock.As>() + .Setup(a => a.Handle(It.IsAny())) + .Returns(Task.CompletedTask); var aggregates = new List { aggregateMock.Object }; - var dispatcher = new AggregateDispatcher(aggregates, loggerMock.Object); + var dispatcher = new Aggregate.EventSubscriber(aggregates, loggerMock.Object); var eventMock = new DummyEvent(); - dispatcher.Dispatch(this, eventMock); + await dispatcher.Subscribe(eventMock); loggerMock.Verify(l => l.Log( It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - (Func)It.IsAny()), + It.IsAny(), + (Func)It.IsAny()), Times.AtLeastOnce); } } diff --git a/tests/SourceFlow.Core.Tests/Impl/CommandBusTests.cs b/tests/SourceFlow.Core.Tests/Impl/CommandBusTests.cs index 07df49f..2b24f08 100644 --- a/tests/SourceFlow.Core.Tests/Impl/CommandBusTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/CommandBusTests.cs @@ -7,55 +7,241 @@ using NUnit.Framework; using SourceFlow.Messaging; using SourceFlow.Messaging.Bus; -using SourceFlow.Impl; +using SourceFlow.Messaging.Bus.Impl; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.Impl { [TestFixture] public class CommandBusTests { + private Mock commandStoreMock; + private Mock> loggerMock; + private Mock commandDispatcherMock; + private CommandBus commandBus; + + [SetUp] + public void Setup() + { + commandStoreMock = new Mock(); + loggerMock = new Mock>(); + commandDispatcherMock = new Mock(); + commandBus = new CommandBus( + commandDispatcherMock.Object, + commandStoreMock.Object, + loggerMock.Object); + } + + [Test] + public void Constructor_NullCommandStore_ThrowsArgumentNullException() + { + Assert.Throws(() => + new CommandBus(commandDispatcherMock.Object, null, loggerMock.Object)); + } + + [Test] + public void Constructor_NullLogger_ThrowsArgumentNullException() + { + Assert.Throws(() => + new CommandBus(commandDispatcherMock.Object, commandStoreMock.Object, null)); + } + + [Test] + public void Constructor_NullCommandDispatcher_ThrowsArgumentNullException() + { + Assert.Throws(() => + new CommandBus(null, commandStoreMock.Object, loggerMock.Object)); + } + [Test] public void Constructor_SetsDependencies() { - var store = new Mock().Object; - var logger = new Mock>().Object; - var bus = new CommandBus(store, logger); - Assert.IsNotNull(bus); + Assert.That(commandBus.commandDispatcher, Is.EqualTo(commandDispatcherMock.Object)); + } + + [Test] + public async Task Publish_NullCommand_ThrowsArgumentNullException() + { + ICommandBus bus = commandBus; + Assert.ThrowsAsync(async () => + await bus.Publish(null)); + } + + [Test] + public async Task Publish_ValidCommand_SetsSequenceNumber() + { + // Arrange + var command = new DummyCommand(); + commandStoreMock.Setup(cs => cs.GetNextSequenceNo(It.IsAny())) + .ReturnsAsync(42); + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + Assert.That(command.Metadata.SequenceNo, Is.EqualTo(42)); + } + + [Test] + public async Task Publish_ValidCommand_DispatchesToCommandDispatcher() + { + // Arrange + var command = new DummyCommand(); + commandStoreMock.Setup(cs => cs.GetNextSequenceNo(It.IsAny())) + .ReturnsAsync(1); + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + commandDispatcherMock.Verify(cd => cd.Dispatch(command), Times.Once); + } + + [Test] + public async Task Publish_ValidCommand_LogsInformation() + { + // Arrange + var command = new DummyCommand(); + commandStoreMock.Setup(cs => cs.GetNextSequenceNo(It.IsAny())) + .ReturnsAsync(1); + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + loggerMock.Verify(l => l.Log( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + (Func)It.IsAny()), + Times.AtLeastOnce); + } + + [Test] + public async Task Publish_ValidCommand_AppendsToStore() + { + // Arrange + var command = new DummyCommand(); + commandStoreMock.Setup(cs => cs.GetNextSequenceNo(It.IsAny())) + .ReturnsAsync(1); + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + commandStoreMock.Verify(cs => cs.Append(command), Times.Once); + } + + [Test] + public async Task Publish_ReplayCommand_DoesNotSetSequenceNumber() + { + // Arrange + var command = new DummyCommand(); + command.Metadata.IsReplay = true; + command.Metadata.SequenceNo = 99; + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + Assert.That(command.Metadata.SequenceNo, Is.EqualTo(99)); + commandStoreMock.Verify(cs => cs.GetNextSequenceNo(It.IsAny()), Times.Never); + } + + [Test] + public async Task Publish_ReplayCommand_DoesNotAppendToStore() + { + // Arrange + var command = new DummyCommand(); + command.Metadata.IsReplay = true; + + // Act + ICommandBus bus = commandBus; + await bus.Publish(command); + + // Assert + commandStoreMock.Verify(cs => cs.Append(It.IsAny()), Times.Never); } [Test] - public void Publish_NullCommand_ThrowsArgumentNullException() + public async Task Replay_NoCommands_DoesNotDispatch() { - var store = new Mock().Object; - var logger = new Mock>().Object; - var bus = (ICommandBus)new CommandBus(store, logger); - Assert.ThrowsAsync(async () => await bus.Publish(null)); + // Arrange + commandStoreMock.Setup(cs => cs.Load(It.IsAny())) + .ReturnsAsync((IEnumerable)null); + + // Act + ICommandBus bus = commandBus; + await bus.Replay(1); + + // Assert + commandDispatcherMock.Verify(cd => cd.Dispatch(It.IsAny()), Times.Never); } [Test] - public async Task Publish_ValidCommand_InvokesDispatchers() + public async Task Replay_WithCommands_DispatchesAllCommands() { - var storeMock = new Mock(); - storeMock.Setup(s => s.GetNextSequenceNo(It.IsAny())).ReturnsAsync(1); - storeMock.Setup(s => s.Append(It.IsAny())).Returns(Task.CompletedTask); - var logger = new Mock>().Object; - var bus = new CommandBus(storeMock.Object, logger); - var commandMock = new DummyCommand(); - bool dispatcherCalled = false; - bus.Dispatchers += (s, c) => dispatcherCalled = true; - await ((ICommandBus)bus).Publish(commandMock); - Assert.IsTrue(dispatcherCalled); + // Arrange + var commands = new List + { + new DummyCommand { Metadata = new Metadata() }, + new DummyCommand { Metadata = new Metadata() }, + new DummyCommand { Metadata = new Metadata() } + }; + commandStoreMock.Setup(cs => cs.Load(It.IsAny())) + .ReturnsAsync(commands); + + // Act + ICommandBus bus = commandBus; + await bus.Replay(1); + + // Assert + commandDispatcherMock.Verify(cd => cd.Dispatch(It.IsAny()), Times.Exactly(3)); } [Test] - public async Task Replay_NoCommands_DoesNothing() + public async Task Replay_WithCommands_MarksCommandsAsReplay() { - var storeMock = new Mock(); - storeMock.Setup(s => s.Load(It.IsAny())).ReturnsAsync((IEnumerable)null); - var logger = new Mock>().Object; - var bus = (ICommandBus)new CommandBus(storeMock.Object, logger); - await bus.Replay(42); - Assert.Pass(); + // Arrange + var commands = new List + { + new DummyCommand { Metadata = new Metadata() }, + new DummyCommand { Metadata = new Metadata() } + }; + commandStoreMock.Setup(cs => cs.Load(It.IsAny())) + .ReturnsAsync(commands); + + // Act + ICommandBus bus = commandBus; + await bus.Replay(1); + + // Assert + Assert.That(commands.All(c => c.Metadata.IsReplay), Is.True); + } + + [Test] + public async Task Replay_WithCommands_DoesNotAppendToStore() + { + // Arrange + var commands = new List + { + new DummyCommand { Metadata = new Metadata() } + }; + commandStoreMock.Setup(cs => cs.Load(It.IsAny())) + .ReturnsAsync(commands); + + // Act + ICommandBus bus = commandBus; + await bus.Replay(1); + + // Assert + commandStoreMock.Verify(cs => cs.Append(It.IsAny()), Times.Never); } } -} \ No newline at end of file +} diff --git a/tests/SourceFlow.Core.Tests/Impl/CommandPublisherTests.cs b/tests/SourceFlow.Core.Tests/Impl/CommandPublisherTests.cs index fac1b18..94330ce 100644 --- a/tests/SourceFlow.Core.Tests/Impl/CommandPublisherTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/CommandPublisherTests.cs @@ -2,6 +2,8 @@ using SourceFlow.Impl; using SourceFlow.Messaging; using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Commands.Impl; namespace SourceFlow.Core.Tests.Impl { @@ -21,7 +23,7 @@ public void Publish_NullCommand_ThrowsArgumentNullException() { var bus = new Mock().Object; var publisher = (ICommandPublisher)new CommandPublisher(bus); - Assert.ThrowsAsync(async () => await publisher.Publish(null)); + Assert.ThrowsAsync(async () => await publisher.Publish(null!)); } [Test] @@ -30,7 +32,7 @@ public void Publish_NullPayloadId_ThrowsInvalidOperationException() var bus = new Mock().Object; var publisher = (ICommandPublisher)new CommandPublisher(bus); var commandMock = new Mock(); - commandMock.Setup(c => c.Payload).Returns((IPayload)null); + commandMock.Setup(c => c.Payload).Returns((IPayload?)null!); Assert.ThrowsAsync(async () => await publisher.Publish(commandMock.Object)); } @@ -40,10 +42,10 @@ public async Task Publish_ValidCommand_DelegatesToCommandBus() var busMock = new Mock(); busMock.Setup(b => b.Publish(It.IsAny())).Returns(Task.CompletedTask); var publisher = (ICommandPublisher)new CommandPublisher(busMock.Object); - var payloadMock = new Mock(); - payloadMock.Setup(p => p.Id).Returns(1); + var payloadMock = new Mock(); var commandMock = new Mock(); commandMock.Setup(c => c.Payload).Returns(payloadMock.Object); + commandMock.Setup(p => p.Entity).Returns(new EntityRef { Id= 1}); await publisher.Publish(commandMock.Object); busMock.Verify(b => b.Publish(commandMock.Object), Times.Once); } diff --git a/tests/SourceFlow.Core.Tests/Impl/CommandReplayerTests.cs b/tests/SourceFlow.Core.Tests/Impl/CommandReplayerTests.cs deleted file mode 100644 index 45d3817..0000000 --- a/tests/SourceFlow.Core.Tests/Impl/CommandReplayerTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Moq; -using SourceFlow.Impl; -using SourceFlow.Messaging.Bus; - -namespace SourceFlow.Core.Tests.Impl -{ - [TestFixture] - public class CommandReplayerTests - { - [Test] - public void Constructor_SetsCommandBus() - { - var bus = new Mock().Object; - var replayer = new CommandReplayer(bus); - Assert.IsNotNull(replayer); - } - - [Test] - public async Task Replay_DelegatesToCommandBus() - { - var busMock = new Mock(); - busMock.Setup(b => b.Replay(It.IsAny())).Returns(Task.CompletedTask); - var replayer = (ICommandReplayer)new CommandReplayer(busMock.Object); - await replayer.Replay(42); - busMock.Verify(b => b.Replay(42), Times.Once); - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Impl/DummyCommand.cs b/tests/SourceFlow.Core.Tests/Impl/DummyCommand.cs index fe198d3..df97fe1 100644 --- a/tests/SourceFlow.Core.Tests/Impl/DummyCommand.cs +++ b/tests/SourceFlow.Core.Tests/Impl/DummyCommand.cs @@ -1,4 +1,5 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.Impl { @@ -9,15 +10,17 @@ public DummyCommand() Payload = new DummyPayload(); Name = "DummyCommand"; Metadata = new Metadata(); + Entity = new EntityRef { Id = 0 }; } public IPayload Payload { get; set; } public string Name { get; set; } public Metadata Metadata { get; set; } + public EntityRef Entity { get; set; } } internal class DummyPayload : IPayload { - public int Id { get; set; } + public int EntityId { get; set; } } } \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Impl/DummyEvent.cs b/tests/SourceFlow.Core.Tests/Impl/DummyEvent.cs index 2e171b9..7add291 100644 --- a/tests/SourceFlow.Core.Tests/Impl/DummyEvent.cs +++ b/tests/SourceFlow.Core.Tests/Impl/DummyEvent.cs @@ -1,5 +1,5 @@ -using SourceFlow.Aggregate; using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Core.Tests.Impl { diff --git a/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs b/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs index d81fe3e..fe805a7 100644 --- a/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs @@ -3,41 +3,127 @@ using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; -using SourceFlow.Aggregate; -using SourceFlow.Impl; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Events; +using SourceFlow.Messaging.Events.Impl; namespace SourceFlow.Core.Tests.Impl { [TestFixture] public class EventQueueTests { + private Mock> loggerMock; + private Mock eventDispatcherMock; + private EventQueue eventQueue; + + [SetUp] + public void Setup() + { + loggerMock = new Mock>(); + eventDispatcherMock = new Mock(); + eventQueue = new EventQueue(eventDispatcherMock.Object, loggerMock.Object); + } + [Test] public void Constructor_NullLogger_ThrowsArgumentNullException() { - Assert.Throws(() => new EventQueue(null)); + Assert.Throws(() => + new EventQueue(eventDispatcherMock.Object, null)); + } + + [Test] + public void Constructor_NullEventDispatcher_ThrowsArgumentNullException() + { + Assert.Throws(() => + new EventQueue(null, loggerMock.Object)); + } + + [Test] + public void Constructor_SetsDependencies() + { + Assert.That(eventQueue.eventDispatcher, Is.EqualTo(eventDispatcherMock.Object)); } [Test] public async Task Enqueue_NullEvent_ThrowsArgumentNullException() { - var logger = new Mock>().Object; - var queue = new EventQueue(logger); - await Task.Yield(); - Assert.ThrowsAsync(async () => await queue.Enqueue(null)); + Assert.ThrowsAsync(async () => + await eventQueue.Enqueue(null)); + } + + [Test] + public async Task Enqueue_ValidEvent_DispatchesToEventDispatcher() + { + // Arrange + var @event = new DummyEvent(); + + // Act + await eventQueue.Enqueue(@event); + + // Assert + eventDispatcherMock.Verify(ed => ed.Dispatch(@event), Times.Once); + } + + [Test] + public async Task Enqueue_ValidEvent_LogsInformation() + { + // Arrange + var @event = new DummyEvent(); + + // Act + await eventQueue.Enqueue(@event); + + // Assert + loggerMock.Verify(l => l.Log( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + (Func)It.IsAny()), + Times.AtLeastOnce); } [Test] - public async Task Enqueue_ValidEvent_InvokesDispatchers() + public async Task Enqueue_ValidEvent_DispatchesBeforeLogging() { - var logger = new Mock>().Object; - var queue = new EventQueue(logger); - var eventMock = new DummyEvent(); - bool dispatcherCalled = false; - queue.Dispatchers += (s, e) => dispatcherCalled = true; - await queue.Enqueue(eventMock); - Assert.IsTrue(dispatcherCalled); + // Arrange + var @event = new DummyEvent(); + var callSequence = new System.Collections.Generic.List(); + + eventDispatcherMock.Setup(ed => ed.Dispatch(It.IsAny())) + .Callback(() => callSequence.Add("Dispatch")) + .Returns(Task.CompletedTask); + + loggerMock.Setup(l => l.Log( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>())) + .Callback(() => callSequence.Add("Log")); + + // Act + await eventQueue.Enqueue(@event); + + // Assert + Assert.That(callSequence[0], Is.EqualTo("Dispatch")); + Assert.That(callSequence[1], Is.EqualTo("Log")); + } + + [Test] + public async Task Enqueue_MultipleEvents_DispatchesAll() + { + // Arrange + var event1 = new DummyEvent(); + var event2 = new DummyEvent(); + var event3 = new DummyEvent(); + + // Act + await eventQueue.Enqueue(event1); + await eventQueue.Enqueue(event2); + await eventQueue.Enqueue(event3); + + // Assert + eventDispatcherMock.Verify(ed => ed.Dispatch(It.IsAny()), Times.Exactly(3)); } } -} \ No newline at end of file +} diff --git a/tests/SourceFlow.Core.Tests/Impl/ProjectionDispatcherTests.cs b/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs similarity index 54% rename from tests/SourceFlow.Core.Tests/Impl/ProjectionDispatcherTests.cs rename to tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs index 94c2d4e..57ea837 100644 --- a/tests/SourceFlow.Core.Tests/Impl/ProjectionDispatcherTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs @@ -1,45 +1,47 @@ using Microsoft.Extensions.Logging; using Moq; -using SourceFlow.Impl; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Events; using SourceFlow.Projections; namespace SourceFlow.Core.Tests.Impl { [TestFixture] - public class ProjectionDispatcherTests + public class ProjectionSubscriberTests { [Test] public void Constructor_NullProjections_ThrowsArgumentNullException() { - var logger = new Mock>().Object; - Assert.Throws(() => new ProjectionDispatcher(null, logger)); + var logger = new Mock>().Object; + Assert.Throws(() => new Projections.EventSubscriber(null, logger)); } [Test] public void Constructor_NullLogger_ThrowsArgumentNullException() { var projections = new List(); - Assert.Throws(() => new ProjectionDispatcher(projections, null)); + Assert.Throws(() => new Projections.EventSubscriber(projections, null)); } [Test] - public void Dispatch_ValidEvent_LogsInformation() + public async Task Dispatch_ValidEvent_LogsInformation() { - var loggerMock = new Mock>(); + var loggerMock = new Mock>(); var projectionMock = new Mock(); - var projections = new List { projectionMock.Object }; - var dispatcher = new ProjectionDispatcher(projections, loggerMock.Object); + // Make the projection implement IProjectOn so it gets called var eventMock = new Mock(); eventMock.Setup(e => e.Name).Returns("TestEvent"); - dispatcher.Dispatch(this, eventMock.Object); + projectionMock.As>() + .Setup(p => p.Apply(It.IsAny())) + .Returns(Task.CompletedTask); + var projections = new List { projectionMock.Object }; + var dispatcher = new Projections.EventSubscriber(projections, loggerMock.Object); + await dispatcher.Subscribe(eventMock.Object); loggerMock.Verify(l => l.Log( It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - (Func)It.IsAny()), + It.IsAny(), + (Func)It.IsAny()), Times.AtLeastOnce); } } diff --git a/tests/SourceFlow.Core.Tests/Impl/SagaDispatcherTests.cs b/tests/SourceFlow.Core.Tests/Impl/SagaDispatcherTests.cs index f5f8125..c40d9fb 100644 --- a/tests/SourceFlow.Core.Tests/Impl/SagaDispatcherTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/SagaDispatcherTests.cs @@ -1,11 +1,11 @@ using System; +using System.Collections.Generic; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; -using SourceFlow.Impl; -using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; using SourceFlow.Saga; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Commands.Impl; namespace SourceFlow.Core.Tests.Impl { @@ -15,36 +15,30 @@ public class SagaDispatcherTests [Test] public void Constructor_SetsLogger() { - var logger = new Mock>().Object; - var dispatcher = new SagaDispatcher(logger); + var logger = new Mock>().Object; + var sagas = new Mock>().Object; + var dispatcher = new CommandSubscriber(sagas, logger); Assert.IsNotNull(dispatcher); } + [Test] - public void Register_AddsSaga() + public async Task Dispatch_WithNoSagas_LogsInformation() { - var logger = new Mock>().Object; - var dispatcher = new SagaDispatcher(logger); - var sagaMock = new Mock(); - dispatcher.Register(sagaMock.Object); - Assert.Pass(); // No exception means success - } + var loggerMock = new Mock>(); + // Use an empty list instead of a mock to avoid null reference issues + var sagas = new List(); - [Test] - public void Dispatch_WithNoSagas_LogsInformation() - { - var loggerMock = new Mock>(); - var dispatcher = new SagaDispatcher(loggerMock.Object); + var dispatcher = new CommandSubscriber(sagas, loggerMock.Object); var commandMock = new DummyCommand(); - var metadataMock = new Mock(); - dispatcher.Dispatch(this, commandMock); + await dispatcher.Subscribe(commandMock); loggerMock.Verify(l => l.Log( It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - (Func)It.IsAny()), + It.IsAny(), + (Func)It.IsAny()), Times.AtLeastOnce); } } diff --git a/tests/SourceFlow.Core.Tests/Interfaces/IEventReplayerTests.cs b/tests/SourceFlow.Core.Tests/Interfaces/IEventReplayerTests.cs deleted file mode 100644 index a74e6da..0000000 --- a/tests/SourceFlow.Core.Tests/Interfaces/IEventReplayerTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Moq; -using SourceFlow.Messaging.Bus; - -namespace SourceFlow.Core.Tests.Interfaces -{ - public class IEventReplayerTests - { - [Test] - public async Task ReplayEventsAsync_DoesNotThrow() - { - var mock = new Mock(); - mock.Setup(r => r.Replay(It.IsAny())).Returns(Task.CompletedTask); - Assert.DoesNotThrowAsync(async () => await mock.Object.Replay(42)); - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Ioc/DummyCommandStore.cs b/tests/SourceFlow.Core.Tests/Ioc/DummyCommandStore.cs index a1c67d1..22b17b0 100644 --- a/tests/SourceFlow.Core.Tests/Ioc/DummyCommandStore.cs +++ b/tests/SourceFlow.Core.Tests/Ioc/DummyCommandStore.cs @@ -1,4 +1,4 @@ -using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.Ioc { @@ -13,7 +13,7 @@ public Task Append(ICommand command) public Task> Load(int aggregateId) { // Simulate loading commands - return Task.FromResult>(null); + return Task.FromResult>(null!); } public Task GetNextSequenceNo(int aggregateId) diff --git a/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs b/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs index 903dfef..16f7c68 100644 --- a/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs +++ b/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs @@ -1,204 +1,40 @@ -using System; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Moq; using NUnit.Framework; -using SourceFlow; using SourceFlow.Aggregate; -using SourceFlow.Impl; using SourceFlow.Messaging; using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; +using SourceFlow.Projections; using SourceFlow.Saga; -using SourceFlow.Services; -namespace SourceFlow.Core.Tests.Ioc +namespace SourceFlow.Tests.Ioc { - public class DummyService : IService - { - public DummyService() - { } - - public Task CreateAggregate() where TAggregateRoot : class, IAggregate - { - var mock = new Mock(); - return Task.FromResult(mock.Object); - } - } - - public class DummyAggregate : Aggregate - { - public DummyAggregate() - { } - - public DummyAggregate(ICommandPublisher publisher, ICommandReplayer replayer, ILogger logger) - { - commandPublisher = publisher; - commandReplayer = replayer; - this.logger = logger; - } - } - - public class DummySaga : ISaga - { - public Task Handle(TCommand command) where TCommand : ICommand => Task.CompletedTask; - } - - public class DummyEntity : IEntity - { public int Id { get; set; } } - [TestFixture] public class IocExtensionsTests { - [Test] - public void UseSourceFlow_AddsExpectedServices() - { - var services = new ServiceCollection(); - services.UseSourceFlow(); - services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); - // Should register core types - Assert.IsTrue(services.Count > 0); - } - - [Test] - public void UseSourceFlow_WithCustomConfig_AddsExpectedServices() - { - var services = new ServiceCollection(); - services.UseSourceFlow(cfg => { }); - Assert.IsTrue(services.Count > 0); - } + // Note: UseSourceFlow requires implementations of IRepository, ICommandStore, and IViewProvider + // which are not provided by the framework itself. These must be implemented by the consuming application. + // Therefore, we cannot test the full registration without providing these implementations. [Test] - public void UseSourceFlow_ResolvesCoreServices() + public void UseSourceFlow_RegistersMultipleEventSubscribers() { + // Arrange var services = new ServiceCollection(); - services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); + services.AddLogging(); // Add logging services + // Act services.UseSourceFlow(); - var provider = services.BuildServiceProvider(); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - } - - [Test] - public void WithService_RegistersService() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.WithService(); - Assert.IsTrue(config.Services.Count > 0); - } - - [Test] - public void WithService_ResolvesService() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.Services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); - - config.WithService(); - var provider = config.Services.BuildServiceProvider(); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - } - - [Test] - public void WithAggregate_RegistersAggregate() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.Services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); - config.Services.AddSingleton(); - config.Services.AddSingleton(); - - config.WithAggregate(c => new DummyAggregate(c.GetService(), c.GetService(), c.GetService())); - Assert.IsTrue(config.Services.Count > 0); - } - - [Test] - public void WithAggregate_ResolvesAggregate() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.Services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); - - config.Services.AddSingleton(c => new CommandBus(new Mock().Object, c.GetService>())); - config.Services.AddSingleton(); - config.Services.AddSingleton(); - - config.WithAggregate(); - - var provider = config.Services.BuildServiceProvider(); - Assert.IsNotNull(provider.GetService()); - Assert.IsNotNull(provider.GetService()); - } - - [Test] - public void WithSaga_RegistersSaga() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.WithSaga(); - Assert.IsTrue(config.Services.Count > 0); - } - - [Test] - public void WithSaga_ResolvesSaga() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - config.Services.AddLogging(builder => - { - builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Information); - }); - - config.WithSaga(); - config.Services.AddSingleton(); + // Assert + var serviceProvider = services.BuildServiceProvider(); + var eventSubscribers = serviceProvider.GetServices(); - var provider = config.Services.BuildServiceProvider(); - Assert.IsNotNull(provider.GetService()); - } - - [Test] - public void WithServices_ThrowsIfFactoryReturnsNull() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - Assert.Throws(() => config.WithServices(_ => null)); - } - - [Test] - public void WithAggregates_ThrowsIfFactoryReturnsNull() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - Assert.Throws(() => config.WithAggregates(_ => null)); - } - - [Test] - public void WithSagas_ThrowsIfFactoryReturnsNull() - { - var config = new IocExtensions.SourceFlowConfig { Services = new ServiceCollection() }; - Assert.Throws(() => config.WithSagas(_ => null)); + // Should have at least 2 event subscribers (Aggregate and Projections) + Assert.That(eventSubscribers, Is.Not.Null); + Assert.That(eventSubscribers.Count(), Is.GreaterThanOrEqualTo(2), + "Should have at least 2 event subscribers (Aggregate and Projections)"); } } } \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Ioc/SourceFlowConfigTests.cs b/tests/SourceFlow.Core.Tests/Ioc/SourceFlowConfigTests.cs deleted file mode 100644 index 466982a..0000000 --- a/tests/SourceFlow.Core.Tests/Ioc/SourceFlowConfigTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace SourceFlow.Core.Tests.Ioc -{ - [TestFixture] - public class SourceFlowConfigTests - { - [Test] - public void Constructor_InitializesServicesProperty() - { - var config = new IocExtensions.SourceFlowConfig(); - Assert.IsNull(config.Services); // Default is null - config.Services = new ServiceCollection(); - Assert.IsNotNull(config.Services); - } - - [Test] - public void ImplementsInterface() - { - var config = new IocExtensions.SourceFlowConfig(); - Assert.IsInstanceOf(config); - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs b/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs new file mode 100644 index 0000000..b8cf2de --- /dev/null +++ b/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs @@ -0,0 +1,73 @@ +using Microsoft.Extensions.Logging; +using SourceFlow.Aggregate; +using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; +using SourceFlow.Projections; +using SourceFlow.Saga; + +namespace SourceFlow.Tests.Ioc +{ + public class TestEntity : IEntity + { + public int Id { get; set; } + } + + public class TestPayload : IPayload + { + // Empty implementation for test + } + + public class TestCommand : ICommand, IName, IMetadata + { + public string Name { get; set; } = "TestCommand"; + public EntityRef Entity { get; set; } = new EntityRef { Id = 1, IsNew = false }; + public IPayload Payload { get; set; } = new TestPayload(); + public Metadata Metadata { get; set; } = new Metadata(); + } + + public class TestEvent : IEvent, IName, IMetadata + { + public string Name { get; set; } = "TestEvent"; + public IEntity Payload { get; set; } = new TestEntity(); + public Metadata Metadata { get; set; } = new Metadata(); + } + + public class TestAggregate : Aggregate, ITestAggregate, IHandles + { + public TestAggregate(ICommandPublisher commandPublisher, ILogger logger) + : base(commandPublisher, logger) { } + + public Task Handle(IEntity entity, TestCommand command) + { + // Implementation not needed for test + return Task.CompletedTask; + } + } + + public class TestSaga : Saga, ITestSaga, IHandles + { + public TestSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, + IRepository repository, ILogger logger) + : base(commandPublisher, eventQueue, repository, logger) { } + + public Task Handle(IEntity entity, TestCommand command) + { + // Implementation not needed for test + return Task.CompletedTask; + } + } + + public interface ITestAggregate { } + + public interface ITestSaga { } + + public class TestProjection : IProjection, IProjectOn + { + public Task Apply(TestEvent @event) + { + // Implementation not needed for test + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Messaging/CommandTests.cs b/tests/SourceFlow.Core.Tests/Messaging/CommandTests.cs index 90868d5..f51403e 100644 --- a/tests/SourceFlow.Core.Tests/Messaging/CommandTests.cs +++ b/tests/SourceFlow.Core.Tests/Messaging/CommandTests.cs @@ -1,15 +1,16 @@ using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; namespace SourceFlow.Core.Tests.Messaging { public class DummyPayload : IPayload { - public int Id { get; set; } + public int EntityId { get; set; } } public class DummyCommand : Command { - public DummyCommand(DummyPayload payload) : base(payload) + public DummyCommand(int entityId, DummyPayload payload) : base(entityId, payload) { } } @@ -20,8 +21,8 @@ public class CommandTests [Test] public void Constructor_InitializesProperties() { - var payload = new DummyPayload { Id = 42 }; - var command = new DummyCommand(payload); + var payload = new DummyPayload { EntityId = 42 }; + var command = new DummyCommand(42, payload); Assert.IsNotNull(command.Metadata); Assert.AreEqual("DummyCommand", command.Name); Assert.AreSame(payload, command.Payload); @@ -30,8 +31,8 @@ public void Constructor_InitializesProperties() [Test] public void ICommandPayload_GetSet_WorksCorrectly() { - var payload = new DummyPayload { Id = 7 }; - var command = new DummyCommand(new DummyPayload()); + var payload = new DummyPayload { EntityId = 7 }; + var command = new DummyCommand(7, new DummyPayload()); ((ICommand)command).Payload = payload; Assert.AreSame(payload, command.Payload); Assert.AreSame(payload, ((ICommand)command).Payload); diff --git a/tests/SourceFlow.Core.Tests/Messaging/EventTests.cs b/tests/SourceFlow.Core.Tests/Messaging/EventTests.cs index 41c5c09..2faed98 100644 --- a/tests/SourceFlow.Core.Tests/Messaging/EventTests.cs +++ b/tests/SourceFlow.Core.Tests/Messaging/EventTests.cs @@ -1,5 +1,4 @@ -using SourceFlow.Aggregate; -using SourceFlow.Messaging; +using SourceFlow.Messaging.Events; namespace SourceFlow.Core.Tests.Messaging { diff --git a/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs b/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs index 9840818..27a6a69 100644 --- a/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs +++ b/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Logging; using Moq; -using SourceFlow.Aggregate; using SourceFlow.Messaging; -using SourceFlow.Messaging.Bus; +using SourceFlow.Messaging.Commands; +using SourceFlow.Messaging.Events; using SourceFlow.Saga; namespace SourceFlow.Core.Tests.Sagas @@ -12,11 +12,11 @@ public class SagaTests { public class TestSaga : Saga, IHandles { - public TestSaga() : this(new Mock().Object, new Mock().Object, new Mock().Object, new Mock().Object) + public TestSaga() : base(new Mock().Object, new Mock().Object, new Mock().Object, new Mock>().Object) { } - public TestSaga(ICommandPublisher publisher, IEventQueue queue, IRepository repo, ILogger logger) + public TestSaga(ICommandPublisher publisher, IEventQueue queue, IRepository repo, ILogger logger):base(publisher, queue, repo, logger) { commandPublisher = publisher; eventQueue = queue; @@ -24,7 +24,7 @@ public TestSaga(ICommandPublisher publisher, IEventQueue queue, IRepository repo this.logger = logger; } - public Task Handle(ICommand command) => Task.CompletedTask; + public Task Handle(IEntity entity, ICommand command) => Task.CompletedTask; public Task TestPublish(ICommand command) => Publish(command); @@ -34,7 +34,7 @@ public TestSaga(ICommandPublisher publisher, IEventQueue queue, IRepository repo [Test] public void CanHandle_ReturnsTrueForMatchingType() { - var saga = new TestSaga(null, null, null, null); + var saga = new TestSaga(); Assert.IsTrue(Saga.CanHandle(saga, typeof(ICommand))); } @@ -42,24 +42,23 @@ public void CanHandle_ReturnsTrueForMatchingType() public void CanHandle_ReturnsFalseForNulls() { Assert.IsFalse(Saga.CanHandle(null, typeof(ICommand))); - var saga = new TestSaga(null, null, null, null); + var saga = new TestSaga(); Assert.IsFalse(Saga.CanHandle(saga, null)); } [Test] public void Publish_NullCommand_ThrowsArgumentNullException() { - var saga = new TestSaga(new Mock().Object, null, null, null); - Assert.ThrowsAsync(async () => await saga.TestPublish(null)); + var saga = new TestSaga(); + Assert.ThrowsAsync(async () => await saga.TestPublish(null!)); } [Test] public void Publish_NullPayload_ThrowsInvalidOperationException() { - var publisher = new Mock().Object; - var saga = new TestSaga(publisher, null, null, null); + var saga = new TestSaga(); var commandMock = new Mock(); - commandMock.Setup(c => c.Payload).Returns((IPayload)null); + commandMock.Setup(c => c.Payload).Returns((IPayload?)null!); Assert.ThrowsAsync(async () => await saga.TestPublish(commandMock.Object)); } @@ -68,11 +67,12 @@ public async Task Publish_ValidCommand_DelegatesToPublisher() { var publisherMock = new Mock(); publisherMock.Setup(p => p.Publish(It.IsAny())).Returns(Task.CompletedTask); - var saga = new TestSaga(publisherMock.Object, null, null, null); + var saga = new TestSaga(publisherMock.Object, new Mock().Object, new Mock().Object, new Mock>().Object); var payloadMock = new Mock(); - payloadMock.Setup(p => p.Id).Returns(1); + var commandMock = new Mock(); commandMock.Setup(c => c.Payload).Returns(payloadMock.Object); + commandMock.Setup(p => p.Entity).Returns(new EntityRef { Id=1}); await saga.TestPublish(commandMock.Object); publisherMock.Verify(p => p.Publish(commandMock.Object), Times.Once); } @@ -80,17 +80,16 @@ public async Task Publish_ValidCommand_DelegatesToPublisher() [Test] public void Raise_NullEvent_ThrowsArgumentNullException() { - var saga = new TestSaga(null, new Mock().Object, null, null); - Assert.ThrowsAsync(async () => await saga.TestRaise(null)); + var saga = new TestSaga(); + Assert.ThrowsAsync(async () => await saga.TestRaise(null!)); } [Test] public void Raise_NullPayload_ThrowsInvalidOperationException() { - var queue = new Mock().Object; - var saga = new TestSaga(null, queue, null, null); + var saga = new TestSaga(); var eventMock = new Mock(); - eventMock.Setup(e => e.Payload).Returns((IEntity)null); + eventMock.Setup(e => e.Payload).Returns((IEntity?)null!); Assert.ThrowsAsync(async () => await saga.TestRaise(eventMock.Object)); } @@ -99,7 +98,7 @@ public async Task Raise_ValidEvent_DelegatesToQueue() { var queueMock = new Mock(); queueMock.Setup(q => q.Enqueue(It.IsAny())).Returns(Task.CompletedTask); - var saga = new TestSaga(null, queueMock.Object, null, null); + var saga = new TestSaga(new Mock().Object, queueMock.Object, new Mock().Object, new Mock>().Object); var payloadMock = new Mock(); var eventMock = new Mock(); eventMock.Setup(e => e.Payload).Returns(payloadMock.Object); diff --git a/tests/SourceFlow.Core.Tests/Services/ServiceTests.cs b/tests/SourceFlow.Core.Tests/Services/ServiceTests.cs deleted file mode 100644 index bee46a5..0000000 --- a/tests/SourceFlow.Core.Tests/Services/ServiceTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.Extensions.Logging; -using Moq; -using SourceFlow.Aggregate; -using SourceFlow.Services; - -namespace SourceFlow.Core.Tests.Services -{ - [TestFixture] - public class ServiceTests - { - public class TestService : Service - { - public TestService() : this(new Mock().Object, new Mock().Object) - { - } - - public TestService(IAggregateFactory factory, ILogger logger) - { - aggregateFactory = factory; - this.logger = logger; - } - - public new Task CreateAggregate() where TAggregate : class, IAggregate => base.CreateAggregate(); - } - - [Test] - public async Task CreateAggregate_DelegatesToFactory() - { - var aggregateMock = new Mock(); - var factoryMock = new Mock(); - factoryMock.Setup(f => f.Create()).ReturnsAsync(aggregateMock.Object); - var logger = new Mock().Object; - var service = new TestService(factoryMock.Object, logger); - var result = await service.CreateAggregate(); - Assert.IsNotNull(result); - Assert.AreSame(aggregateMock.Object, result); - } - } -} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj b/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj index 9cc5458..469da4d 100644 --- a/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj +++ b/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj @@ -27,4 +27,8 @@ + + + + From 929b055765477c862a740abd8d72a5c84f849092 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sun, 23 Nov 2025 19:29:41 +0000 Subject: [PATCH 02/41] - Checkin v1.0.0 working code --- Images/Architecture.png | Bin 0 -> 333914 bytes Images/Sourceflow.Net-Concept.drawio | 218 +++++++++++++++ .../Aggregates/AccountAggregate.cs | 4 +- .../Impl/InMemoryCommandStore.cs | 47 +++- src/SourceFlow.ConsoleApp/Program.cs | 2 +- .../Sagas/AccountSaga.cs | 2 +- src/SourceFlow/Aggregate/Aggregate.cs | 10 +- src/SourceFlow/Aggregate/EventSubscriber.cs | 19 +- src/SourceFlow/IocExtensions.cs | 71 ++--- .../Messaging/Bus/Impl/CommandBus.cs | 14 +- .../Messaging/Commands/ICommandDispatcher.cs | 2 +- .../Commands/Impl/CommandDispatcher.cs | 2 +- .../Commands/Impl/CommandPublisher.cs | 4 +- .../Messaging/Events/IEventDispatcher.cs | 2 +- .../Messaging/Events/Impl/EventDispatcher.cs | 2 +- .../Messaging/Events/Impl/EventQueue.cs | 8 +- src/SourceFlow/Projections/EventSubscriber.cs | 11 +- src/SourceFlow/Saga/CommandSubscriber.cs | 10 +- src/SourceFlow/Saga/Saga.cs | 26 +- .../Aggregates/AggregateTests.cs | 10 +- .../Aggregates/EventSubscriberTests.cs | 154 +++++++++++ .../E2E/Aggregates/AccountAggregate.cs | 9 +- tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs | 3 +- .../E2E/Sagas/AccountSaga.cs | 2 +- .../Impl/EventQueueTests.cs | 12 +- .../InMemoryCommandStoreThreadSafetyTests.cs | 211 +++++++++++++++ .../Impl/ProjectionSubscriberTests.cs | 6 +- .../Ioc/IocExtensionsTests.cs | 256 +++++++++++++++++- .../Ioc/TestImplementations.cs | 10 +- .../Projections/EventSubscriberTests.cs | 155 +++++++++++ .../Sagas/CommandSubscriberTests.cs | 158 +++++++++++ .../SourceFlow.Core.Tests/Sagas/SagaTests.cs | 8 +- .../SourceFlow.Core.Tests.csproj | 1 + 33 files changed, 1296 insertions(+), 153 deletions(-) create mode 100644 Images/Architecture.png create mode 100644 Images/Sourceflow.Net-Concept.drawio create mode 100644 tests/SourceFlow.Core.Tests/Aggregates/EventSubscriberTests.cs create mode 100644 tests/SourceFlow.Core.Tests/Impl/InMemoryCommandStoreThreadSafetyTests.cs create mode 100644 tests/SourceFlow.Core.Tests/Projections/EventSubscriberTests.cs create mode 100644 tests/SourceFlow.Core.Tests/Sagas/CommandSubscriberTests.cs diff --git a/Images/Architecture.png b/Images/Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4687773546f2ebd44ac566f6dd0d9d4fe96ba0 GIT binary patch literal 333914 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

Ti-P} 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 G1pf~wCkf2} literal 0 HcmV?d00001 diff --git a/Images/Sourceflow.Net-Concept.drawio b/Images/Sourceflow.Net-Concept.drawio new file mode 100644 index 0000000..51e88a6 --- /dev/null +++ b/Images/Sourceflow.Net-Concept.drawio @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs b/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs index 48cf38c..4437c78 100644 --- a/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs +++ b/src/SourceFlow.ConsoleApp/Aggregates/AccountAggregate.cs @@ -9,7 +9,7 @@ namespace SourceFlow.ConsoleApp.Aggregates public class AccountAggregate : Aggregate, ISubscribes, IAccountAggregate { - public AccountAggregate(ICommandPublisher commandPublisher, ILogger logger) + public AccountAggregate(Lazy commandPublisher, ILogger logger) : base(commandPublisher, logger) { } @@ -58,7 +58,7 @@ public Task Handle(AccountCreated @event) } public Task RepayHistory(int accountId) { - return commandPublisher.ReplayCommands(accountId); + return commandPublisher.Value.ReplayCommands(accountId); } } } \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs b/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs index ca2d519..8619529 100644 --- a/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs +++ b/src/SourceFlow.ConsoleApp/Impl/InMemoryCommandStore.cs @@ -1,37 +1,64 @@ using System.Collections.Concurrent; +using System.Collections.Immutable; using SourceFlow.Messaging; using SourceFlow.Messaging.Commands; namespace SourceFlow.ConsoleApp.Impl { + ///

+ /// Thread-safe in-memory implementation of ICommandStore using immutable collections. + /// public class InMemoryCommandStore : ICommandStore { - private readonly ConcurrentDictionary> _store = new(); + // Thread-safe: ImmutableList creates new instance on every Add + private readonly ConcurrentDictionary> _store = new(); + // Thread-safe: Atomic counter per entity for sequence number generation + private readonly ConcurrentDictionary _sequenceCounters = new(); + + /// + /// Appends a command to the store in a thread-safe manner. + /// public Task Append(ICommand command) { - if (!_store.ContainsKey(command.Entity.Id)) - _store[command.Entity.Id] = new List(); + if (command == null) + throw new ArgumentNullException(nameof(command)); - _store[command.Entity.Id].Add(command); + // AddOrUpdate is atomic - thread-safe + _store.AddOrUpdate( + command.Entity.Id, + // Add: Create new list with this command + _ => ImmutableList.Create(command), + // Update: Add command to existing list (creates new immutable list) + (_, existingList) => existingList.Add(command) + ); return Task.CompletedTask; } + /// + /// Loads all commands for the specified entity. + /// public async Task> Load(int entityId) { return await Task.FromResult(_store.TryGetValue(entityId, out var events) - ? events + ? events.AsEnumerable() : Enumerable.Empty()); } + /// + /// Gets the next sequence number for the specified entity in a thread-safe manner. + /// public Task GetNextSequenceNo(int entityId) { - if (_store.TryGetValue(entityId, out var events)) - { - return Task.FromResult(events.Max(c => ((IMetadata)c).Metadata.SequenceNo) + 1); - } - return Task.FromResult(1); + // AddOrUpdate is atomic - thread-safe increment + var nextSeq = _sequenceCounters.AddOrUpdate( + entityId, + 1, // First sequence number for new entity + (_, current) => current + 1 // Atomic increment for existing entity + ); + + return Task.FromResult(nextSeq); } } } \ No newline at end of file diff --git a/src/SourceFlow.ConsoleApp/Program.cs b/src/SourceFlow.ConsoleApp/Program.cs index 812df00..c650294 100644 --- a/src/SourceFlow.ConsoleApp/Program.cs +++ b/src/SourceFlow.ConsoleApp/Program.cs @@ -15,7 +15,7 @@ builder.SetMinimumLevel(LogLevel.Information); }); -services.UseSourceFlow(); +services.UseSourceFlow(typeof(AccountAggregate).Assembly); var serviceProvider = services.BuildServiceProvider(); diff --git a/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs b/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs index 53d9320..dc44e9d 100644 --- a/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs +++ b/src/SourceFlow.ConsoleApp/Sagas/AccountSaga.cs @@ -15,7 +15,7 @@ public class AccountSaga : Saga, IHandlesWithEvent, IHandles { - public AccountSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : + public AccountSaga(Lazy commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : base(commandPublisher, eventQueue, repository, logger) { } diff --git a/src/SourceFlow/Aggregate/Aggregate.cs b/src/SourceFlow/Aggregate/Aggregate.cs index d8c6486..1d52bea 100644 --- a/src/SourceFlow/Aggregate/Aggregate.cs +++ b/src/SourceFlow/Aggregate/Aggregate.cs @@ -15,14 +15,14 @@ public abstract class Aggregate : IAggregate /// /// The command publisher used to publish commands. /// - protected ICommandPublisher commandPublisher; + protected Lazy commandPublisher; /// /// Logger for the aggregate root to log events and errors. /// protected ILogger logger; - protected Aggregate(ICommandPublisher commandPublisher, ILogger logger) + protected Aggregate(Lazy commandPublisher, ILogger logger) { this.commandPublisher = commandPublisher; this.logger = logger; @@ -35,7 +35,7 @@ protected Aggregate(ICommandPublisher commandPublisher, ILogger logg /// public Task ReplayCommands(int entityId) { - return commandPublisher.ReplayCommands(entityId); + return commandPublisher.Value.ReplayCommands(entityId); } /// @@ -45,12 +45,12 @@ public Task ReplayCommands(int entityId) /// /// /// - protected Task Send(ICommand command) + protected Task Send(TCommand command) where TCommand : ICommand { if (command == null) throw new ArgumentNullException(nameof(command)); - return commandPublisher.Publish(command); + return commandPublisher.Value.Publish(command); } } } \ No newline at end of file diff --git a/src/SourceFlow/Aggregate/EventSubscriber.cs b/src/SourceFlow/Aggregate/EventSubscriber.cs index f3a0457..80728c9 100644 --- a/src/SourceFlow/Aggregate/EventSubscriber.cs +++ b/src/SourceFlow/Aggregate/EventSubscriber.cs @@ -44,29 +44,22 @@ public EventSubscriber(IEnumerable aggregates, ILogger /// /// - public async Task Subscribe(TEvent @event) where TEvent : IEvent + public Task Subscribe(TEvent @event) where TEvent : IEvent { var tasks = new List(); foreach (var aggregate in aggregates) { - var handlerType = typeof(ISubscribes<>).MakeGenericType(typeof(TEvent)); - if (!handlerType.IsAssignableFrom(aggregate.GetType())) + if (!(aggregate is ISubscribes eventSubscriber)) continue; - var method = typeof(ISubscribes<>) - .MakeGenericType(typeof(TEvent)) - .GetMethod(nameof(ISubscribes.Handle)); + tasks.Add(eventSubscriber.Handle(@event)); - var task = (Task)method.Invoke(aggregate, new object[] { @event }); - - tasks.Add(task); - - logger?.LogInformation("Action=Event_Disptcher_Aggregate, Event={Event}, Aggregate={Aggregate}, Handler:{Handler}", - typeof(TEvent).Name, aggregate.GetType().Name, method.Name); + logger?.LogInformation("Action=Event_Disptcher_Aggregate, Event={Event}, Aggregate={Aggregate}", + typeof(TEvent).Name, aggregate.GetType().Name); } - await Task.WhenAll(tasks); + return Task.WhenAll(tasks); } } } \ No newline at end of file diff --git a/src/SourceFlow/IocExtensions.cs b/src/SourceFlow/IocExtensions.cs index eb62ba7..b1577ae 100644 --- a/src/SourceFlow/IocExtensions.cs +++ b/src/SourceFlow/IocExtensions.cs @@ -62,57 +62,28 @@ public static void UseSourceFlow(this IServiceCollection services, ServiceLifeti // Register factories services.Add(ServiceDescriptor.Describe(typeof(IAggregateFactory), typeof(AggregateFactory), lifetime)); + // Register infrastructure services that will be used by Sagas/Aggregates + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + // Register Lazy to break circular dependency + // Sagas and Aggregates will receive this instead of direct ICommandPublisher + services.AddSingleton>(provider => + new Lazy(() => provider.GetRequiredService())); + // Register Sagas and Aggregates with proper constructor injection + // They now depend on Lazy which defers resolution RegisterSagasWithConstructorInjection(services, assemblies, lifetime); RegisterAggregatesWithConstructorInjection(services, assemblies, lifetime); - // Register infrastructure services that depend on Sagas/Aggregates - services.AddSingleton(provider => - new CommandSubscriber( - provider.GetServices(), - provider.GetService>())); - - services.AddSingleton(provider => - new CommandDispatcher( - provider.GetServices(), - provider.GetService>())); - - services.AddSingleton(provider => - new CommandBus( - provider.GetService(), - provider.GetService(), - provider.GetService>())); - - services.AddSingleton(provider => - new CommandPublisher(provider.GetService())); - - // Register the concrete EventSubscriber implementations - services.AddSingleton(provider => - new Aggregate.EventSubscriber( - provider.GetServices(), - provider.GetService>())); - - services.AddSingleton(provider => - new Projections.EventSubscriber( - provider.GetServices(), - provider.GetService>())); - - // Register factory methods to get each implementation as IEventSubscriber - // This allows the DI container to collect both when requesting IEnumerable - services.AddSingleton(provider => - provider.GetRequiredService()); - services.AddSingleton(provider => - provider.GetRequiredService()); - - services.AddSingleton(provider => - new EventDispatcher( - provider.GetServices(), - provider.GetService>())); - - services.AddSingleton(provider => - new EventQueue( - provider.GetService(), - provider.GetService>())); + // Register event subscribers as singleton services + services.AddSingleton(); + services.AddSingleton(); + + services.AddSingleton(); + services.AddSingleton(); } private static void RegisterSagasWithConstructorInjection(IServiceCollection services, Assembly[] assemblies, ServiceLifetime lifetime) @@ -126,7 +97,7 @@ private static void RegisterSagasWithConstructorInjection(IServiceCollection ser // Register as concrete type for direct access services.Add(ServiceDescriptor.Describe(sagaType, sagaType, lifetime)); - // Register as all other interfaces the saga implements + // Register as all other interfaces the saga implements (needed for IHandles resolution) var interfaces = sagaType.GetInterfaces() .Where(i => i != typeof(ISaga) && i.IsPublic); foreach (var iface in interfaces) @@ -149,7 +120,7 @@ private static void RegisterAggregatesWithConstructorInjection(IServiceCollectio // Register as all other interfaces the aggregate implements var interfaces = aggregateType.GetInterfaces() - .Where(i => i != typeof(IAggregate) && i.IsPublic); + .Where(i => i != typeof(IAggregate) && i != typeof(ISubscribes<>) && i.IsPublic); foreach (var iface in interfaces) { services.Add(ServiceDescriptor.Describe(iface, aggregateType, lifetime)); @@ -205,6 +176,7 @@ private static IEnumerable GetImplementedTypes(Type interfaceType, Assembl .Where(t => interfaceType.IsAssignableFrom(t) && t.IsClass && !t.IsAbstract && + t.IsPublic && !t.IsGenericType && !t.ContainsGenericParameters); } @@ -216,6 +188,7 @@ private static IEnumerable GetImplementedTypes(Type interfaceType, Assembl interfaceType.IsAssignableFrom(t) && t.IsClass && !t.IsAbstract && + t.IsPublic && !t.IsGenericType && !t.ContainsGenericParameters); } diff --git a/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs b/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs index eaff959..eb2dff3 100644 --- a/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs +++ b/src/SourceFlow/Messaging/Bus/Impl/CommandBus.cs @@ -46,12 +46,12 @@ public CommandBus(ICommandDispatcher commandDispatcher, ICommandStore commandSto /// /// /// - async Task ICommandBus.Publish(TCommand command) + Task ICommandBus.Publish(TCommand command) { if (command == null) throw new ArgumentNullException(nameof(command)); - await Dispatch(command); + return Dispatch(command); } private async Task Dispatch(TCommand command) where TCommand : ICommand @@ -64,7 +64,7 @@ private async Task Dispatch(TCommand command) where TCommand : IComman await commandDispatcher.Dispatch(command); // 3. Log event. - logger?.LogInformation("Action=Command_Dispatched, Command={Command}, Payload={Payload}, SequenceNo={No}, Saga={Saga}", + logger?.LogInformation("Action=Command_Dispatched, Command={Command}, Payload={Payload}, SequenceNo={No}", command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo); // 4. When event is not replayed @@ -88,7 +88,13 @@ async Task ICommandBus.Replay(int entityId) foreach (var command in commands.ToList()) { command.Metadata.IsReplay = true; - await Dispatch(command); + + // Call Dispatch with the concrete command type to preserve generics + var commandType = command.GetType(); + var dispatchMethod = this.GetType().GetMethod(nameof(Dispatch), + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var genericDispatchMethod = dispatchMethod.MakeGenericMethod(commandType); + await (Task)genericDispatchMethod.Invoke(this, new object[] { command }); } } } diff --git a/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs b/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs index 67d4071..d0f7916 100644 --- a/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs +++ b/src/SourceFlow/Messaging/Commands/ICommandDispatcher.cs @@ -9,6 +9,6 @@ public interface ICommandDispatcher /// Dispatches a command to the registered sagas. /// /// - Task Dispatch(ICommand command); + Task Dispatch(TCommand command) where TCommand : ICommand; } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs b/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs index 0a07d84..5fe4ca2 100644 --- a/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs +++ b/src/SourceFlow/Messaging/Commands/Impl/CommandDispatcher.cs @@ -36,7 +36,7 @@ public CommandDispatcher(IEnumerable commandSubscribers, ILo /// /// /// - public Task Dispatch(ICommand command) + public Task Dispatch(TCommand command) where TCommand : ICommand { return Send(command); } diff --git a/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs b/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs index 9b2da45..000b7b7 100644 --- a/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs +++ b/src/SourceFlow/Messaging/Commands/Impl/CommandPublisher.cs @@ -41,7 +41,7 @@ public Task ReplayCommands(int entityId) /// /// /// - async Task ICommandPublisher.Publish(TCommand command) + Task ICommandPublisher.Publish(TCommand command) { if (command == null) throw new ArgumentNullException(nameof(command)); @@ -52,7 +52,7 @@ async Task ICommandPublisher.Publish(TCommand command) if (!command.Entity.IsNew && command.Entity?.Id == null) throw new InvalidOperationException(nameof(command) + " requires entity id when not new entity."); - await commandBus.Publish(command); + return commandBus.Publish(command); } } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Events/IEventDispatcher.cs b/src/SourceFlow/Messaging/Events/IEventDispatcher.cs index b2ea46d..e323e73 100644 --- a/src/SourceFlow/Messaging/Events/IEventDispatcher.cs +++ b/src/SourceFlow/Messaging/Events/IEventDispatcher.cs @@ -4,6 +4,6 @@ namespace SourceFlow.Messaging.Events { public interface IEventDispatcher { - Task Dispatch(IEvent @event); + Task Dispatch(TEvent @event) where TEvent : IEvent; } } \ No newline at end of file diff --git a/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs b/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs index 5a3e3d3..d3295a4 100644 --- a/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs +++ b/src/SourceFlow/Messaging/Events/Impl/EventDispatcher.cs @@ -36,7 +36,7 @@ public EventDispatcher(IEnumerable subscribers, ILogger /// /// - public Task Dispatch(IEvent @event) + public Task Dispatch(TEvent @event) where TEvent : IEvent { var tasks = new List(); diff --git a/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs b/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs index 54f6b00..ae42661 100644 --- a/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs +++ b/src/SourceFlow/Messaging/Events/Impl/EventQueue.cs @@ -36,16 +36,16 @@ public EventQueue(IEventDispatcher eventDispatcher, ILogger logger) /// /// /// - public async Task Enqueue(TEvent @event) + public Task Enqueue(TEvent @event) where TEvent : IEvent { if (@event == null) throw new ArgumentNullException(nameof(@event)); - await eventDispatcher.Dispatch(@event); - logger?.LogInformation("Action=Event_Enqueue, Event={Event}, Payload={Payload}", - @event.GetType().Name, @event.Payload.GetType().Name); + @event.GetType().Name, @event.Payload.GetType().Name); + + return eventDispatcher.Dispatch(@event); } } } \ No newline at end of file diff --git a/src/SourceFlow/Projections/EventSubscriber.cs b/src/SourceFlow/Projections/EventSubscriber.cs index d23be6d..6b4e9c2 100644 --- a/src/SourceFlow/Projections/EventSubscriber.cs +++ b/src/SourceFlow/Projections/EventSubscriber.cs @@ -50,17 +50,10 @@ public async Task Subscribe(TEvent @event) foreach (var projection in projections) { - var projectionType = typeof(IProjectOn<>).MakeGenericType(typeof(TEvent)); - if (!projectionType.IsAssignableFrom(projection.GetType())) + if (!(projection is IProjectOn eventSubscriber)) continue; - var method = typeof(IProjectOn<>) - .MakeGenericType(typeof(TEvent)) - .GetMethod(nameof(IProjectOn.Apply)); - - var task = (Task)method.Invoke(projection, new object[] { @event }); - - tasks.Add(task); + tasks.Add(eventSubscriber.Apply(@event)); logger?.LogInformation("Action=Event_Dispatcher_View, Event={Event}, Apply:{Apply}", @event.Name, projection.GetType().Name); diff --git a/src/SourceFlow/Saga/CommandSubscriber.cs b/src/SourceFlow/Saga/CommandSubscriber.cs index b186f58..639ca4f 100644 --- a/src/SourceFlow/Saga/CommandSubscriber.cs +++ b/src/SourceFlow/Saga/CommandSubscriber.cs @@ -39,14 +39,14 @@ public CommandSubscriber(IEnumerable sagas, ILogger l /// /// /// - public async Task Subscribe(TCommand command) where TCommand : ICommand + public Task Subscribe(TCommand command) where TCommand : ICommand { if (!sagas.Any()) { logger?.LogInformation("Action=Command_Dispatcher, Command={Command}, Payload={Payload}, SequenceNo={No}, Message=No Sagas Found", command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo); - return; + return Task.CompletedTask; } var tasks = new List(); @@ -58,7 +58,7 @@ public async Task Subscribe(TCommand command) where TCommand : IComman tasks.Add(Send(saga, command)); } - await Task.WhenAll(tasks); + return Task.WhenAll(tasks); } ///
@@ -68,14 +68,14 @@ public async Task Subscribe(TCommand command) where TCommand : IComman /// /// /// - private async Task Send(ISaga saga, TCommand command) where TCommand : ICommand + private Task Send(ISaga saga, TCommand command) where TCommand : ICommand { // 4. Log event. logger?.LogInformation("Action=Command_Dispatcher_Send, Command={Command}, Payload={Payload}, SequenceNo={No}, Saga={Saga}", command.GetType().Name, command.Payload.GetType().Name, ((IMetadata)command).Metadata.SequenceNo, saga.GetType().Name); // 2. handle event by Saga? - await saga.Handle(command); + return saga.Handle(command); } ///// diff --git a/src/SourceFlow/Saga/Saga.cs b/src/SourceFlow/Saga/Saga.cs index 9608a50..8bbef5b 100644 --- a/src/SourceFlow/Saga/Saga.cs +++ b/src/SourceFlow/Saga/Saga.cs @@ -21,7 +21,7 @@ public abstract class Saga : ISaga /// /// The command publisher is typically used to dispatch commands to their respective /// handlers. Derived classes can use this member to publish commands as part of their functionality. - protected ICommandPublisher commandPublisher; + protected Lazy commandPublisher; /// /// Represents the queue used to manage and process events. @@ -44,7 +44,7 @@ public abstract class Saga : ISaga /// /// Initializes a new instance of the class. /// - public Saga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) + public Saga(Lazy commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) { this.commandPublisher = commandPublisher ?? throw new ArgumentNullException(nameof(commandPublisher)); this.eventQueue = eventQueue ?? throw new ArgumentNullException(nameof(eventQueue)); @@ -81,7 +81,14 @@ async Task ISaga.Handle(TCommand command) { if (!(this is IHandles handles)) + { + logger?.LogWarning("Action=Saga_CannotHandle, Saga={Saga}, Command={Command}, Reason=NotImplementingIHandles", + GetType().Name, typeof(TCommand).Name); return; + } + + logger?.LogInformation("Action=Saga_Starting, Saga={Saga}, Command={Command}", + GetType().Name, typeof(TCommand).Name); TAggregate entity; if (command.Entity.IsNew) @@ -100,7 +107,7 @@ async Task ISaga.Handle(TCommand command) await RaiseEvent(command, entity); } - private async Task RaiseEvent(TCommand command, TAggregate entity) where TCommand : ICommand + private Task RaiseEvent(TCommand command, TAggregate entity) where TCommand : ICommand { try { @@ -143,17 +150,22 @@ private async Task RaiseEvent(TCommand command, TAggregate entity) whe { // Ensure payload set if (ev.Payload == null && entity != null) - ev.Payload = entity; + ev.Payload = entity; - await Raise(ev); + // Call Raise with the concrete event type to preserve generics + var raiseMethod = this.GetType().GetMethod(nameof(Raise), BindingFlags.NonPublic | BindingFlags.Instance); + var genericRaiseMethod = raiseMethod.MakeGenericMethod(eventType); + return (Task)genericRaiseMethod.Invoke(this, new object[] { ev }); } - } + } } catch (Exception ex) { // Don't break saga processing if raising event fails; log the error. logger?.LogError(ex, "Action=Saga_RaiseEventFailed, Saga={Saga}, Command={Command}", GetType().Name, command.GetType().Name); } + + return Task.CompletedTask; } @@ -190,7 +202,7 @@ protected Task Publish(TCommand command) if (command.Entity?.Id == null) throw new InvalidOperationException(nameof(command) + "requires entity reference with id"); - return commandPublisher.Publish(command); + return commandPublisher.Value.Publish(command); } /// diff --git a/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs b/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs index b400a19..11bca5d 100644 --- a/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs +++ b/tests/SourceFlow.Core.Tests/Aggregates/AggregateTests.cs @@ -15,6 +15,7 @@ public class AggregateTests { private Mock commandPublisherMock; private Mock> loggerMock; + private Lazy lazyCommandPublisher; private TestAggregate aggregate; [SetUp] @@ -22,14 +23,15 @@ public void Setup() { commandPublisherMock = new Mock(); loggerMock = new Mock>(); - aggregate = new TestAggregate(commandPublisherMock.Object, loggerMock.Object); + lazyCommandPublisher = new Lazy(() => commandPublisherMock.Object); + aggregate = new TestAggregate(lazyCommandPublisher, loggerMock.Object); } [Test] public void Constructor_SetsCommandPublisher() { // Assert - Assert.That(aggregate.GetCommandPublisher(), Is.EqualTo(commandPublisherMock.Object)); + Assert.That(aggregate.GetCommandPublisher().Value, Is.EqualTo(commandPublisherMock.Object)); } [Test] @@ -89,13 +91,13 @@ public async Task Send_NullPayload_PublishesCommand() // Test aggregate concrete implementation private class TestAggregate : Aggregate { - public TestAggregate(ICommandPublisher commandPublisher, ILogger logger) + public TestAggregate(Lazy commandPublisher, ILogger logger) : base(commandPublisher, logger) { } // Expose protected members for testing - public ICommandPublisher GetCommandPublisher() => commandPublisher; + public Lazy GetCommandPublisher() => commandPublisher; public ILogger GetLogger() => logger; // Expose Send method for testing diff --git a/tests/SourceFlow.Core.Tests/Aggregates/EventSubscriberTests.cs b/tests/SourceFlow.Core.Tests/Aggregates/EventSubscriberTests.cs new file mode 100644 index 0000000..584f671 --- /dev/null +++ b/tests/SourceFlow.Core.Tests/Aggregates/EventSubscriberTests.cs @@ -0,0 +1,154 @@ +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using SourceFlow.Aggregate; +using SourceFlow.Messaging.Events; + +namespace SourceFlow.Core.Tests.Aggregates +{ + public class DummyAggregateEntity : IEntity + { + public int Id { get; set; } + } + + public class DummyAggregateEvent : Event + { + public DummyAggregateEvent(DummyAggregateEntity payload) : base(payload) { } + } + + public class TestAggregate : IAggregate, ISubscribes + { + public bool Handled { get; private set; } = false; + + public Task Handle(DummyAggregateEvent @event) + { + Handled = true; + return Task.CompletedTask; + } + } + + public class NonMatchingAggregate : IAggregate + { + // This aggregate does not implement ISubscribes so won't handle DummyAggregateEvent + } + + [TestFixture] + public class AggregateEventSubscriberTests + { + private Mock> _mockLogger; + private DummyAggregateEvent _testEvent; + + [SetUp] + public void SetUp() + { + _mockLogger = new Mock>(); + _testEvent = new DummyAggregateEvent(new DummyAggregateEntity { Id = 1 }); + } + + [Test] + public void Constructor_WithNullAggregates_ThrowsArgumentNullException() + { + // Arrange + IEnumerable nullAggregates = null; + + // Act & Assert + Assert.Throws(() => + new EventSubscriber(nullAggregates, _mockLogger.Object)); + } + + [Test] + public void Constructor_WithNullLogger_ThrowsArgumentNullException() + { + // Arrange + var aggregates = new List { new TestAggregate() }; + + // Act & Assert + Assert.Throws(() => + new EventSubscriber(aggregates, null)); + } + + [Test] + public void Constructor_WithValidParameters_Succeeds() + { + // Arrange + var aggregates = new List { new TestAggregate() }; + + // Act + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Assert + Assert.IsNotNull(subscriber); + } + + [Test] + public async Task Subscribe_WithMatchingAggregate_HandlesEvent() + { + // Arrange + var testAggregate = new TestAggregate(); + var aggregates = new List { testAggregate }; + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // Assert + Assert.IsTrue(testAggregate.Handled); + } + + [Test] + public async Task Subscribe_WithNonMatchingAggregate_DoesNotHandleEvent() + { + // Arrange + var nonMatchingAggregate = new NonMatchingAggregate(); + var aggregates = new List { nonMatchingAggregate }; + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // This test is more about ensuring no exception is thrown and that non-matching aggregates + // are simply skipped, which is the expected behavior + } + + [Test] + public async Task Subscribe_WithMultipleAggregates_HandlesEventInMatchingAggregatesOnly() + { + // Arrange + var matchingAggregate1 = new TestAggregate(); + var matchingAggregate2 = new TestAggregate(); + var nonMatchingAggregate = new NonMatchingAggregate(); + var aggregates = new List { matchingAggregate1, nonMatchingAggregate, matchingAggregate2 }; + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // Assert + Assert.IsTrue(matchingAggregate1.Handled); + Assert.IsTrue(matchingAggregate2.Handled); + } + + [Test] + public async Task Subscribe_WithNoMatchingAggregates_DoesNotThrow() + { + // Arrange + var nonMatchingAggregate = new NonMatchingAggregate(); + var aggregates = new List { nonMatchingAggregate }; + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Act & Assert + Assert.DoesNotThrowAsync(async () => await subscriber.Subscribe(_testEvent)); + } + + [Test] + public async Task Subscribe_WithEmptyAggregatesCollection_DoesNotThrow() + { + // Arrange + var aggregates = new List(); + var subscriber = new EventSubscriber(aggregates, _mockLogger.Object); + + // Act & Assert + Assert.DoesNotThrowAsync(async () => await subscriber.Subscribe(_testEvent)); + } + } +} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs b/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs index 4cb3a79..090932b 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Aggregates/AccountAggregate.cs @@ -9,7 +9,7 @@ namespace SourceFlow.Core.Tests.E2E.Aggregates public class AccountAggregate : Aggregate, ISubscribes, IAccountAggregate { - public AccountAggregate(ICommandPublisher commandPublisher, ILogger logger) : + public AccountAggregate(Lazy commandPublisher, ILogger logger) : base(commandPublisher, logger) { } @@ -55,10 +55,9 @@ public Task CloseAccount(int accountId, string reason) public Task Handle(AccountCreated @event) { - return Send(new ActivateAccount(@event.Payload.Id, new ActivationPayload - { - ActiveOn = DateTime.UtcNow, - })); + // To prevent infinite loops, this method does nothing + // Activation should happen through commands, not through event handling cycles + return Task.CompletedTask; } public Task RepayHistory(int accountId) diff --git a/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs b/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs index 9905a0e..d9e7b1f 100644 --- a/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs +++ b/tests/SourceFlow.Core.Tests/E2E/E2E.Tests.cs @@ -35,8 +35,9 @@ public void SetUp() _serviceProvider = services.BuildServiceProvider(); - _accountAggregate = _serviceProvider.GetRequiredService(); _saga = _serviceProvider.GetRequiredService(); + _accountAggregate = _serviceProvider.GetRequiredService(); + _logger = _serviceProvider.GetRequiredService>(); _viewRepository = _serviceProvider.GetRequiredService(); } diff --git a/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs b/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs index eb1ce89..0e97966 100644 --- a/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs +++ b/tests/SourceFlow.Core.Tests/E2E/Sagas/AccountSaga.cs @@ -15,7 +15,7 @@ public class AccountSaga : Saga, IHandlesWithEvent, IHandles { - public AccountSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : + public AccountSaga(Lazy commandPublisher, IEventQueue eventQueue, IRepository repository, ILogger logger) : base(commandPublisher, eventQueue, repository, logger) { } diff --git a/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs b/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs index fe805a7..7da33d6 100644 --- a/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/EventQueueTests.cs @@ -60,7 +60,7 @@ public async Task Enqueue_ValidEvent_DispatchesToEventDispatcher() await eventQueue.Enqueue(@event); // Assert - eventDispatcherMock.Verify(ed => ed.Dispatch(@event), Times.Once); + eventDispatcherMock.Verify(ed => ed.Dispatch(@event), Times.Once); } [Test] @@ -83,13 +83,13 @@ public async Task Enqueue_ValidEvent_LogsInformation() } [Test] - public async Task Enqueue_ValidEvent_DispatchesBeforeLogging() + public async Task Enqueue_ValidEvent_DispatchesAfterLogging() { // Arrange var @event = new DummyEvent(); var callSequence = new System.Collections.Generic.List(); - eventDispatcherMock.Setup(ed => ed.Dispatch(It.IsAny())) + eventDispatcherMock.Setup(ed => ed.Dispatch(It.IsAny())) .Callback(() => callSequence.Add("Dispatch")) .Returns(Task.CompletedTask); @@ -105,8 +105,8 @@ public async Task Enqueue_ValidEvent_DispatchesBeforeLogging() await eventQueue.Enqueue(@event); // Assert - Assert.That(callSequence[0], Is.EqualTo("Dispatch")); - Assert.That(callSequence[1], Is.EqualTo("Log")); + Assert.That(callSequence[0], Is.EqualTo("Log")); + Assert.That(callSequence[1], Is.EqualTo("Dispatch")); } [Test] @@ -123,7 +123,7 @@ public async Task Enqueue_MultipleEvents_DispatchesAll() await eventQueue.Enqueue(event3); // Assert - eventDispatcherMock.Verify(ed => ed.Dispatch(It.IsAny()), Times.Exactly(3)); + eventDispatcherMock.Verify(ed => ed.Dispatch(It.IsAny()), Times.Exactly(3)); } } } diff --git a/tests/SourceFlow.Core.Tests/Impl/InMemoryCommandStoreThreadSafetyTests.cs b/tests/SourceFlow.Core.Tests/Impl/InMemoryCommandStoreThreadSafetyTests.cs new file mode 100644 index 0000000..d4a320b --- /dev/null +++ b/tests/SourceFlow.Core.Tests/Impl/InMemoryCommandStoreThreadSafetyTests.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using SourceFlow.ConsoleApp.Impl; +using SourceFlow.Core.Tests.Impl; +using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; + +namespace SourceFlow.Core.Tests.Impl +{ + [TestFixture] + public class InMemoryCommandStoreThreadSafetyTests + { + [Test] + public async Task Append_ConcurrentAccess_NoDataLoss() + { + // Arrange + var store = new InMemoryCommandStore(); + var entityId = 1; + var commandCount = 1000; + var threadCount = 10; + var commandsPerThread = commandCount / threadCount; + + // Act: Append commands concurrently from multiple threads + var tasks = Enumerable.Range(0, threadCount) + .Select(threadId => Task.Run(async () => + { + for (int i = 0; i < commandsPerThread; i++) + { + var command = new DummyCommand + { + Entity = new EntityRef { Id = entityId }, + Metadata = new Metadata { SequenceNo = threadId * commandsPerThread + i } + }; + await store.Append(command); + } + })); + + await Task.WhenAll(tasks); + + // Assert: All commands persisted + var commands = await store.Load(entityId); + var commandList = commands.ToList(); + + Assert.That(commandList.Count, Is.EqualTo(commandCount), + "All commands should be persisted, none lost"); + } + + [Test] + public async Task GetNextSequenceNo_ConcurrentAccess_UniqueSequenceNumbers() + { + // Arrange + var store = new InMemoryCommandStore(); + var entityId = 1; + var sequenceCount = 1000; + var threadCount = 10; + var sequencesPerThread = sequenceCount / threadCount; + var sequenceNumbers = new System.Collections.Concurrent.ConcurrentBag(); + + // Act: Get sequence numbers concurrently + var tasks = Enumerable.Range(0, threadCount) + .Select(_ => Task.Run(async () => + { + for (int i = 0; i < sequencesPerThread; i++) + { + var seqNo = await store.GetNextSequenceNo(entityId); + sequenceNumbers.Add(seqNo); + } + })); + + await Task.WhenAll(tasks); + + // Assert: All sequence numbers are unique + var uniqueSequences = sequenceNumbers.Distinct().ToList(); + Assert.That(uniqueSequences.Count, Is.EqualTo(sequenceCount), + "All sequence numbers should be unique"); + + // Assert: Sequence numbers are in valid range + Assert.That(uniqueSequences.Min(), Is.EqualTo(1), + "Minimum sequence should be 1"); + Assert.That(uniqueSequences.Max(), Is.EqualTo(sequenceCount), + "Maximum sequence should equal count"); + } + + [Test] + public async Task Append_MultipleEntities_ConcurrentAccess_NoInterference() + { + // Arrange + var store = new InMemoryCommandStore(); + var entityCount = 10; + var commandsPerEntity = 100; + + // Act: Append to multiple entities concurrently + var tasks = Enumerable.Range(1, entityCount) + .Select(entityId => Task.Run(async () => + { + for (int i = 0; i < commandsPerEntity; i++) + { + var command = new DummyCommand + { + Entity = new EntityRef { Id = entityId }, + Metadata = new Metadata { SequenceNo = i + 1 } + }; + await store.Append(command); + } + })); + + await Task.WhenAll(tasks); + + // Assert: Each entity has correct count + for (int entityId = 1; entityId <= entityCount; entityId++) + { + var commands = await store.Load(entityId); + Assert.That(commands.Count(), Is.EqualTo(commandsPerEntity), + $"Entity {entityId} should have {commandsPerEntity} commands"); + } + } + + [Test] + public async Task GetNextSequenceNo_AppendConcurrently_SequenceMatchesCommandCount() + { + // Arrange + var store = new InMemoryCommandStore(); + var entityId = 1; + var commandCount = 500; + + // Act: Get sequence and append concurrently + var tasks = Enumerable.Range(0, commandCount) + .Select(_ => Task.Run(async () => + { + var seqNo = await store.GetNextSequenceNo(entityId); + var command = new DummyCommand + { + Entity = new EntityRef { Id = entityId }, + Metadata = new Metadata { SequenceNo = seqNo } + }; + await store.Append(command); + })); + + await Task.WhenAll(tasks); + + // Assert: Command count matches last sequence number + var commands = await store.Load(entityId); + var commandList = commands.ToList(); + + Assert.That(commandList.Count, Is.EqualTo(commandCount)); + + // Assert: All sequences are unique and sequential (may not be ordered) + var sequences = commandList.Select(c => c.Metadata.SequenceNo).ToList(); + var uniqueSequences = sequences.Distinct().ToList(); + + Assert.That(uniqueSequences.Count, Is.EqualTo(commandCount), + "All commands should have unique sequence numbers"); + Assert.That(uniqueSequences.OrderBy(s => s).SequenceEqual(Enumerable.Range(1, commandCount)), + "Sequences should be 1 through N with no gaps"); + } + + [Test] + public async Task Append_HighConcurrency_StressTest() + { + // Arrange + var store = new InMemoryCommandStore(); + var entityId = 1; + var commandCount = 10000; + var threadCount = 100; + var commandsPerThread = commandCount / threadCount; + + // Act: Heavy concurrent load + var tasks = Enumerable.Range(0, threadCount) + .Select(threadId => Task.Run(async () => + { + for (int i = 0; i < commandsPerThread; i++) + { + var seqNo = await store.GetNextSequenceNo(entityId); + var command = new DummyCommand + { + Entity = new EntityRef { Id = entityId }, + Metadata = new Metadata { SequenceNo = seqNo } + }; + await store.Append(command); + } + })); + + await Task.WhenAll(tasks); + + // Assert: No data loss, no corruption + var commands = await store.Load(entityId); + var commandList = commands.ToList(); + + Assert.That(commandList.Count, Is.EqualTo(commandCount), + "No commands should be lost under high concurrency"); + + var sequences = commandList.Select(c => c.Metadata.SequenceNo).ToList(); + Assert.That(sequences.Distinct().Count(), Is.EqualTo(commandCount), + "All sequence numbers should be unique"); + } + + [Test] + public void Append_NullCommand_ThrowsArgumentNullException() + { + // Arrange + var store = new InMemoryCommandStore(); + + // Act & Assert + Assert.ThrowsAsync(async () => + await store.Append(null!)); + } + } +} diff --git a/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs b/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs index 57ea837..36a41f7 100644 --- a/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs +++ b/tests/SourceFlow.Core.Tests/Impl/ProjectionSubscriberTests.cs @@ -12,14 +12,14 @@ public class ProjectionSubscriberTests public void Constructor_NullProjections_ThrowsArgumentNullException() { var logger = new Mock>().Object; - Assert.Throws(() => new Projections.EventSubscriber(null, logger)); + Assert.Throws(() => new SourceFlow.Projections.EventSubscriber(null, logger)); } [Test] public void Constructor_NullLogger_ThrowsArgumentNullException() { var projections = new List(); - Assert.Throws(() => new Projections.EventSubscriber(projections, null)); + Assert.Throws(() => new SourceFlow.Projections.EventSubscriber(projections, null)); } [Test] @@ -34,7 +34,7 @@ public async Task Dispatch_ValidEvent_LogsInformation() .Setup(p => p.Apply(It.IsAny())) .Returns(Task.CompletedTask); var projections = new List { projectionMock.Object }; - var dispatcher = new Projections.EventSubscriber(projections, loggerMock.Object); + var dispatcher = new SourceFlow.Projections.EventSubscriber(projections, loggerMock.Object); await dispatcher.Subscribe(eventMock.Object); loggerMock.Verify(l => l.Log( It.IsAny(), diff --git a/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs b/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs index 16f7c68..f94998e 100644 --- a/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs +++ b/tests/SourceFlow.Core.Tests/Ioc/IocExtensionsTests.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using NUnit.Framework; using SourceFlow.Aggregate; using SourceFlow.Messaging; @@ -10,31 +11,270 @@ namespace SourceFlow.Tests.Ioc { + // Test implementations for required interfaces + public class TestRepository : IRepository + { + public Task Get(int id) where TEntity : class, IEntity + { + return Task.FromResult(null); + } + + public Task Persist(TEntity entity) where TEntity : IEntity + { + return Task.CompletedTask; + } + + public Task Delete(TEntity entity) where TEntity : IEntity + { + return Task.CompletedTask; + } + } + + public class TestCommandStore : ICommandStore + { + public Task Append(ICommand command) + { + return Task.CompletedTask; + } + + public Task> Load(int aggregateId) + { + return Task.FromResult>(new List()); + } + + public Task GetNextSequenceNo(int aggregateId) + { + return Task.FromResult(0); + } + } + + public class TestViewProvider : IViewProvider + { + public Task Find(int id) where TViewModel : class, IViewModel + { + return Task.FromResult(null); + } + + public Task Push(TViewModel model) where TViewModel : IViewModel + { + return Task.CompletedTask; + } + } + [TestFixture] public class IocExtensionsTests { - // Note: UseSourceFlow requires implementations of IRepository, ICommandStore, and IViewProvider - // which are not provided by the framework itself. These must be implemented by the consuming application. - // Therefore, we cannot test the full registration without providing these implementations. + private ServiceCollection _services; + private ServiceProvider _serviceProvider; + + [SetUp] + public void SetUp() + { + _services = new ServiceCollection(); + _services.AddLogging(); // Add logging services + + // Register test implementations for required interfaces + _services.AddSingleton(); + _services.AddSingleton(); + _services.AddSingleton(); + } + + [TearDown] + public void TearDown() + { + _serviceProvider?.Dispose(); + } [Test] public void UseSourceFlow_RegistersMultipleEventSubscribers() { // Arrange - var services = new ServiceCollection(); - services.AddLogging(); // Add logging services + // Test implementations already registered in SetUp // Act - services.UseSourceFlow(); + _services.UseSourceFlow(); // Assert - var serviceProvider = services.BuildServiceProvider(); - var eventSubscribers = serviceProvider.GetServices(); + _serviceProvider = _services.BuildServiceProvider(); + var eventSubscribers = _serviceProvider.GetServices(); // Should have at least 2 event subscribers (Aggregate and Projections) Assert.That(eventSubscribers, Is.Not.Null); Assert.That(eventSubscribers.Count(), Is.GreaterThanOrEqualTo(2), "Should have at least 2 event subscribers (Aggregate and Projections)"); } + + [Test] + public void UseSourceFlow_RegistersCommandSubscriber() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var commandSubscriber = _serviceProvider.GetService(); + + Assert.That(commandSubscriber, Is.Not.Null, "ICommandSubscriber should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersCommandDispatcher() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var commandDispatcher = _serviceProvider.GetService(); + + Assert.That(commandDispatcher, Is.Not.Null, "ICommandDispatcher should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersCommandBus() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var commandBus = _serviceProvider.GetService(); + + Assert.That(commandBus, Is.Not.Null, "ICommandBus should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersCommandPublisher() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var commandPublisher = _serviceProvider.GetService(); + + Assert.That(commandPublisher, Is.Not.Null, "ICommandPublisher should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersEventDispatcher() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var eventDispatcher = _serviceProvider.GetService(); + + Assert.That(eventDispatcher, Is.Not.Null, "IEventDispatcher should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersEventQueue() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var eventQueue = _serviceProvider.GetService(); + + Assert.That(eventQueue, Is.Not.Null, "IEventQueue should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersRequiredInfrastructureServices() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + + // Check that all infrastructure services are registered + Assert.That(_serviceProvider.GetService(), Is.Not.Null, "IRepository should be registered"); + Assert.That(_serviceProvider.GetService(), Is.Not.Null, "ICommandStore should be registered"); + Assert.That(_serviceProvider.GetService(), Is.Not.Null, "IViewProvider should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersAggregateFactory() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var aggregateFactory = _serviceProvider.GetService(); + + Assert.That(aggregateFactory, Is.Not.Null, "IAggregateFactory should be registered"); + } + + [Test] + public void UseSourceFlow_RegistersAllServices_WithoutThrowing() + { + // Arrange + // Test implementations already registered in SetUp + + // Act & Assert - should not throw + Assert.DoesNotThrow(() => + { + _services.UseSourceFlow(); + _serviceProvider = _services.BuildServiceProvider(); + + // Try to resolve all major services to ensure they can be created + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + _ = _serviceProvider.GetService(); + }); + } + + [Test] + public void UseSourceFlow_RegistersEventSubscribersAsEnumerable() + { + // Arrange + // Test implementations already registered in SetUp + + // Act + _services.UseSourceFlow(); + + // Assert + _serviceProvider = _services.BuildServiceProvider(); + var eventSubscribers = _serviceProvider.GetServices(); + + Assert.That(eventSubscribers, Is.Not.Null, "IEventSubscriber enumerable should not be null"); + Assert.That(eventSubscribers.Count(), Is.GreaterThanOrEqualTo(2), + "Should have at least 2 IEventSubscriber implementations"); + } } } \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs b/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs index b8cf2de..c680f7e 100644 --- a/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs +++ b/tests/SourceFlow.Core.Tests/Ioc/TestImplementations.cs @@ -33,9 +33,9 @@ public class TestEvent : IEvent, IName, IMetadata public Metadata Metadata { get; set; } = new Metadata(); } - public class TestAggregate : Aggregate, ITestAggregate, IHandles + internal class TestAggregate : Aggregate, ITestAggregate, IHandles { - public TestAggregate(ICommandPublisher commandPublisher, ILogger logger) + public TestAggregate(Lazy commandPublisher, ILogger logger) : base(commandPublisher, logger) { } public Task Handle(IEntity entity, TestCommand command) @@ -45,10 +45,10 @@ public Task Handle(IEntity entity, TestCommand command) } } - public class TestSaga : Saga, ITestSaga, IHandles + internal class TestSaga : Saga, ITestSaga, IHandles { - public TestSaga(ICommandPublisher commandPublisher, IEventQueue eventQueue, - IRepository repository, ILogger logger) + public TestSaga(Lazy commandPublisher, IEventQueue eventQueue, + IRepository repository, ILogger logger) : base(commandPublisher, eventQueue, repository, logger) { } public Task Handle(IEntity entity, TestCommand command) diff --git a/tests/SourceFlow.Core.Tests/Projections/EventSubscriberTests.cs b/tests/SourceFlow.Core.Tests/Projections/EventSubscriberTests.cs new file mode 100644 index 0000000..eedbddd --- /dev/null +++ b/tests/SourceFlow.Core.Tests/Projections/EventSubscriberTests.cs @@ -0,0 +1,155 @@ +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using SourceFlow.Messaging.Events; +using SourceFlow.Projections; + +namespace SourceFlow.Core.Tests.Projections +{ + public class DummyProjectionEntity : IEntity + { + public int Id { get; set; } + } + + public class DummyProjectionEvent : Event + { + public DummyProjectionEvent(DummyProjectionEntity payload) : base(payload) { } + } + + public class TestProjection : IProjectOn, IProjection + { + public bool Applied { get; private set; } = false; + + public Task Apply(DummyProjectionEvent @event) + { + Applied = true; + return Task.CompletedTask; + } + } + + public class NonMatchingProjection : IProjection + { + // This projection does not implement IProjectOn so won't handle DummyProjectionEvent + } + + [TestFixture] + public class EventSubscriberTests + { + private Mock> _mockLogger; + private DummyProjectionEvent _testEvent; + + [SetUp] + public void SetUp() + { + _mockLogger = new Mock>(); + _testEvent = new DummyProjectionEvent(new DummyProjectionEntity { Id = 1 }); + } + + [Test] + public void Constructor_WithNullProjections_ThrowsArgumentNullException() + { + // Arrange + IEnumerable nullProjections = null; + + // Act & Assert + Assert.Throws(() => + new EventSubscriber(nullProjections, _mockLogger.Object)); + } + + [Test] + public void Constructor_WithNullLogger_ThrowsArgumentNullException() + { + // Arrange + var projections = new List { new TestProjection() }; + + // Act & Assert + Assert.Throws(() => + new EventSubscriber(projections, null)); + } + + [Test] + public void Constructor_WithValidParameters_Succeeds() + { + // Arrange + var projections = new List { new TestProjection() }; + + // Act + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Assert + Assert.IsNotNull(subscriber); + } + + [Test] + public async Task Subscribe_WithMatchingProjection_AppliesProjection() + { + // Arrange + var testProjection = new TestProjection(); + var projections = new List { testProjection }; + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // Assert + Assert.IsTrue(testProjection.Applied); + } + + [Test] + public async Task Subscribe_WithNonMatchingProjection_DoesNotApplyProjection() + { + // Arrange + var nonMatchingProjection = new NonMatchingProjection(); + var projections = new List { nonMatchingProjection }; + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // Assert + // We can't directly test this, but we know that non-matching projections won't be applied + // since they don't implement IProjectOn + } + + [Test] + public async Task Subscribe_WithMultipleProjections_AppliesMatchingProjectionsOnly() + { + // Arrange + var matchingProjection1 = new TestProjection(); + var matchingProjection2 = new TestProjection(); + var nonMatchingProjection = new NonMatchingProjection(); + var projections = new List { matchingProjection1, nonMatchingProjection, matchingProjection2 }; + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testEvent); + + // Assert + Assert.IsTrue(matchingProjection1.Applied); + Assert.IsTrue(matchingProjection2.Applied); + } + + [Test] + public async Task Subscribe_WithNoMatchingProjections_DoesNotThrow() + { + // Arrange + var nonMatchingProjection = new NonMatchingProjection(); + var projections = new List { nonMatchingProjection }; + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Act & Assert + Assert.DoesNotThrowAsync(async () => await subscriber.Subscribe(_testEvent)); + } + + [Test] + public async Task Subscribe_WithEmptyProjectionsCollection_DoesNotThrow() + { + // Arrange + var projections = new List(); + var subscriber = new EventSubscriber(projections, _mockLogger.Object); + + // Act & Assert + Assert.DoesNotThrowAsync(async () => await subscriber.Subscribe(_testEvent)); + } + } +} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Sagas/CommandSubscriberTests.cs b/tests/SourceFlow.Core.Tests/Sagas/CommandSubscriberTests.cs new file mode 100644 index 0000000..0752086 --- /dev/null +++ b/tests/SourceFlow.Core.Tests/Sagas/CommandSubscriberTests.cs @@ -0,0 +1,158 @@ +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using SourceFlow.Messaging; +using SourceFlow.Messaging.Commands; +using SourceFlow.Saga; + +namespace SourceFlow.Core.Tests.Sagas +{ + public class DummyCommandPayload : IPayload + { + public int Id { get; set; } + public string Data { get; set; } = string.Empty; + } + + public class DummyCommand : Command + { + public DummyCommand(DummyCommandPayload payload) : base(true, payload) + { + } + } + + public class TestSaga : ISaga, IHandles + { + public bool Handled { get; private set; } = false; + public Type LastHandledCommandType { get; private set; } + public DummyCommand LastHandledCommand { get; private set; } + + public Task Handle(TCommand command) where TCommand : ICommand + { + if (this is IHandles handles) + { + Handled = true; + LastHandledCommandType = typeof(TCommand); + if (command is DummyCommand dummyCommand) + { + LastHandledCommand = dummyCommand; + } + } + return Task.CompletedTask; + } + + public Task Handle(IEntity entity, DummyCommand command) + { + Handled = true; + LastHandledCommandType = typeof(DummyCommand); + LastHandledCommand = command; + return Task.CompletedTask; + } + } + + public class NonHandlingSaga : ISaga + { + public bool Handled { get; private set; } = false; + + public Task Handle(TCommand command) where TCommand : ICommand + { + // This saga doesn't implement IHandles, so it won't handle the command + // But we still want to track if this method was called + Handled = true; // This will be true if the ISaga.Handle method is called + return Task.CompletedTask; + } + } + + [TestFixture] + public class CommandSubscriberTests + { + private Mock> _mockLogger; + private DummyCommand _testCommand; + + [SetUp] + public void SetUp() + { + _mockLogger = new Mock>(); + _testCommand = new DummyCommand(new DummyCommandPayload { Id = 1, Data = "Test" }); + } + + [Test] + public void Constructor_WithValidParameters_Succeeds() + { + // Arrange + var sagas = new List { new TestSaga() }; + + // Act + var subscriber = new CommandSubscriber(sagas, _mockLogger.Object); + + // Assert + Assert.IsNotNull(subscriber); + } + + [Test] + public async Task Subscribe_WithMatchingSaga_HandlesCommand() + { + // Arrange + var testSaga = new TestSaga(); + var sagas = new List { testSaga }; + var subscriber = new CommandSubscriber(sagas, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testCommand); + + // Assert + Assert.IsTrue(testSaga.Handled); + Assert.AreEqual(typeof(DummyCommand), testSaga.LastHandledCommandType); + } + + [Test] + public async Task Subscribe_WithEmptySagasCollection_DoesNotThrow() + { + // Arrange + var sagas = new List(); + + // Act + var subscriber = new CommandSubscriber(sagas, _mockLogger.Object); + + // Assert + Assert.IsNotNull(subscriber); + + // Act & Assert - should not throw and should just return early + Assert.DoesNotThrowAsync(async () => await subscriber.Subscribe(_testCommand)); + } + + [Test] + public async Task Subscribe_WithMultipleSagas_HandlesCommandInAllMatchingSagas() + { + // Arrange + var testSaga1 = new TestSaga(); + var testSaga2 = new TestSaga(); + var nonHandlingSaga = new NonHandlingSaga(); + var sagas = new List { testSaga1, nonHandlingSaga, testSaga2 }; + var subscriber = new CommandSubscriber(sagas, _mockLogger.Object); + + // Act + await subscriber.Subscribe(_testCommand); + + // Assert + Assert.IsTrue(testSaga1.Handled); + Assert.IsTrue(testSaga2.Handled); + Assert.IsFalse(nonHandlingSaga.Handled); // This saga doesn't implement IHandles + Assert.AreEqual(typeof(DummyCommand), testSaga1.LastHandledCommandType); + Assert.AreEqual(typeof(DummyCommand), testSaga2.LastHandledCommandType); + } + + [Test] + public async Task Subscribe_NullSagas_StillCreatesSubscriber() + { + // Arrange & Act + var subscriber = new CommandSubscriber(null, _mockLogger.Object); + + // Assert + Assert.IsNotNull(subscriber); + + // Note: The CommandSubscriber constructor doesn't validate null sagas, + // so we just test that it doesn't throw during construction. + // During Subscribe(), it would check sagas.Any() which would handle null. + } + } +} \ No newline at end of file diff --git a/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs b/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs index 27a6a69..b74c82f 100644 --- a/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs +++ b/tests/SourceFlow.Core.Tests/Sagas/SagaTests.cs @@ -12,11 +12,11 @@ public class SagaTests { public class TestSaga : Saga, IHandles { - public TestSaga() : base(new Mock().Object, new Mock().Object, new Mock().Object, new Mock>().Object) + public TestSaga() : base(new Lazy(() => new Mock().Object), new Mock().Object, new Mock().Object, new Mock>().Object) { } - public TestSaga(ICommandPublisher publisher, IEventQueue queue, IRepository repo, ILogger logger):base(publisher, queue, repo, logger) + public TestSaga(Lazy publisher, IEventQueue queue, IRepository repo, ILogger logger):base(publisher, queue, repo, logger) { commandPublisher = publisher; eventQueue = queue; @@ -67,7 +67,7 @@ public async Task Publish_ValidCommand_DelegatesToPublisher() { var publisherMock = new Mock(); publisherMock.Setup(p => p.Publish(It.IsAny())).Returns(Task.CompletedTask); - var saga = new TestSaga(publisherMock.Object, new Mock().Object, new Mock().Object, new Mock>().Object); + var saga = new TestSaga(new Lazy(() => publisherMock.Object), new Mock().Object, new Mock().Object, new Mock>().Object); var payloadMock = new Mock(); var commandMock = new Mock(); @@ -98,7 +98,7 @@ public async Task Raise_ValidEvent_DelegatesToQueue() { var queueMock = new Mock(); queueMock.Setup(q => q.Enqueue(It.IsAny())).Returns(Task.CompletedTask); - var saga = new TestSaga(new Mock().Object, queueMock.Object, new Mock().Object, new Mock>().Object); + var saga = new TestSaga(new Lazy(() => new Mock().Object), queueMock.Object, new Mock().Object, new Mock>().Object); var payloadMock = new Mock(); var eventMock = new Mock(); eventMock.Setup(e => e.Payload).Returns(payloadMock.Object); diff --git a/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj b/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj index 469da4d..a97dca0 100644 --- a/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj +++ b/tests/SourceFlow.Core.Tests/SourceFlow.Core.Tests.csproj @@ -22,6 +22,7 @@ + From 203e2d1aac89285abde6f73a3db2835bbc634880 Mon Sep 17 00:00:00 2001 From: Ninja Date: Sun, 23 Nov 2025 21:04:38 +0000 Subject: [PATCH 03/41] - update read me --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cf4142f..9d74b5d 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,20 @@ SourceFlow.Net empowers developers to build scalable, maintainable applications * ⚡ CQRS Implementation with Command/Query Segregation * 📊 Event-First Design with Event Sourcing Foundation * 🧱 Clean Architecture - + +### Concept +- `Aggregate` wraps the root entity to manage changes to the root aggregate by publishing commands. +- `Saga` is a long running transaction and subscribes to `commands` to manage the actual updates to root aggregate within the domain bounded context. +- Saga basically `orchestrates` the success and failure flows to `update` the `state` of `root aggregate` accordingly. +- Saga can also publish `commands` to `itself` or `other` saga's. +- Saga can be defined to raise `events` when handling commands. +- `Events` are published to `subscribers`. +- There are two subscribers to event - ie. i. `Aggregates` ii. `Views` +- `Aggregate` subscribe to `events` to manage `changes` to root aggregate based upon `external` stimulus. ie. changes in any saga workflow +- `View` subscribe to `events` to `write` data to `view model`, views source `transformed` data for viewers. ie. `UI` could read data from view model (with eventual consistency). + +arcitecture + ## Getting Started ### Installation nuget add package SourceFlow.Net From 0eb432bb899d6ed82fcc4cdbc28d41ac11af86a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=98DE=20N!NJ=CE=94?= Date: Sun, 23 Nov 2025 21:12:24 +0000 Subject: [PATCH 04/41] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: CØDE N!NJΔ --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d74b5d..33db684 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ SourceFlow.Net empowers developers to build scalable, maintainable applications - `Aggregate` subscribe to `events` to manage `changes` to root aggregate based upon `external` stimulus. ie. changes in any saga workflow - `View` subscribe to `events` to `write` data to `view model`, views source `transformed` data for viewers. ie. `UI` could read data from view model (with eventual consistency). -arcitecture +arcitecture ## Getting Started ### Installation From bb1bb4cc04f0cca3257e276dcc09d21f21a206cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=98DE=20N!NJ=CE=94?= Date: Sun, 23 Nov 2025 21:16:20 +0000 Subject: [PATCH 05/41] Refactor Aggregate and Saga descriptions in README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidate and clarify the explanations of Aggregate and Saga in the README. Signed-off-by: CØDE N!NJΔ --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 33db684..1331bf7 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,9 @@ SourceFlow.Net empowers developers to build scalable, maintainable applications * 🧱 Clean Architecture ### Concept -- `Aggregate` wraps the root entity to manage changes to the root aggregate by publishing commands. -- `Saga` is a long running transaction and subscribes to `commands` to manage the actual updates to root aggregate within the domain bounded context. -- Saga basically `orchestrates` the success and failure flows to `update` the `state` of `root aggregate` accordingly. -- Saga can also publish `commands` to `itself` or `other` saga's. -- Saga can be defined to raise `events` when handling commands. -- `Events` are published to `subscribers`. -- There are two subscribers to event - ie. i. `Aggregates` ii. `Views` +- `Aggregate` wraps the root aggregate entity that you wish to manage changes by publishing commands. +- `Saga` is a long running transaction that subscribes to `commands` to apply actual updates to root aggregate within the domain bounded context. Saga basically `orchestrates` the success and failure flows to `update` the `state` of `root aggregate` accordingly. Saga can also publish `commands` to `itself` or `other` saga's. Saga can be defined to raise `events` when handling commands. +- `Events` are published to `subscribers`. There are two subscribers to event - ie. i. `Aggregates` ii. `Views` - `Aggregate` subscribe to `events` to manage `changes` to root aggregate based upon `external` stimulus. ie. changes in any saga workflow - `View` subscribe to `events` to `write` data to `view model`, views source `transformed` data for viewers. ie. `UI` could read data from view model (with eventual consistency). From 8a919e291afbbdf07f37295c138c9dc7dcf8291c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=98DE=20N!NJ=CE=94?= Date: Sun, 23 Nov 2025 21:21:08 +0000 Subject: [PATCH 06/41] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: CØDE N!NJΔ --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1331bf7..214a86d 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ SourceFlow.Net empowers developers to build scalable, maintainable applications - `Aggregate` wraps the root aggregate entity that you wish to manage changes by publishing commands. - `Saga` is a long running transaction that subscribes to `commands` to apply actual updates to root aggregate within the domain bounded context. Saga basically `orchestrates` the success and failure flows to `update` the `state` of `root aggregate` accordingly. Saga can also publish `commands` to `itself` or `other` saga's. Saga can be defined to raise `events` when handling commands. - `Events` are published to `subscribers`. There are two subscribers to event - ie. i. `Aggregates` ii. `Views` -- `Aggregate` subscribe to `events` to manage `changes` to root aggregate based upon `external` stimulus. ie. changes in any saga workflow -- `View` subscribe to `events` to `write` data to `view model`, views source `transformed` data for viewers. ie. `UI` could read data from view model (with eventual consistency). +- `Aggregate` subscribes to `events` to publish `changes` to root aggregate based upon `external` stimulus. ie. potential changes from any other saga workflow that could affect the state of Aggregate in context. +- `View` subscribes to `events` to `write` data to `view model`, view sources `transformed` data for interested viewers. ie. `UI` (viewer) could read data from view model (with eventual consistency). arcitecture From 6ef0065ec8cb1bde44b79b45384e5513d5b000bc Mon Sep 17 00:00:00 2001 From: Ninja Date: Sun, 23 Nov 2025 21:29:29 +0000 Subject: [PATCH 07/41] - update Architecture.png --- Images/Architecture.png | Bin 333914 -> 324307 bytes Images/Sourceflow.Net-Concept.drawio | 225 ++++++++++++++------------- 2 files changed, 116 insertions(+), 109 deletions(-) diff --git a/Images/Architecture.png b/Images/Architecture.png index 0a4687773546f2ebd44ac566f6dd0d9d4fe96ba0..80f340dcf6d144bc925feee02fbadc26449eb7ec 100644 GIT binary patch literal 324307 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�iy({&J0gBK^d_ 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