public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup <Startup>(); }) .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((context, builder) => { builder.AddEnvironmentVariables(); }) .ConfigureLogging((context, logger) => { logger .AddConsole(); }) .ConfigureServices((context, collection) => { var config = @"akka.loglevel = INFO akka.actor.debug.receive = on akka.actor.debug.unhandled = on akka.actor.debug.event-stream = on akka.stdout-loglevel = INFO"; var actorSystem = ActorSystem.Create("bank-system", config); var aggregateManager = actorSystem.ActorOf(Props.Create(() => new AggregateManager())); var num = 1; foreach (var id in SeedData.UserIds) { var name = $"User{num}"; var email = $"user-{num}@foo.com"; var registerUser = new RegisterUser(id, name, email, "SE", "1234567890"); var savings = 2 * num; var credit = num; var openAccount = new OpenBankAccount(id, savings, credit); aggregateManager.Tell(registerUser, ActorRefs.NoSender); aggregateManager.Tell(openAccount, ActorRefs.NoSender); num++; } collection .AddSingleton(actorSystem) .AddSingleton(_ => new AggregateManagerRef(aggregateManager)) .AddTransient <UserClubAssignmentService>(); });
public async Task Execute(string[] args) { var account = new BankAccount(Guid.NewGuid()); var openAccount = new OpenBankAccount(); account.Execute(openAccount); await _repository.Save(account); var rand = new Random(); for (var x = 0; x < 10; x++) { var isCredit = rand.NextDouble() >= 0.5; var amount = rand.Next(0, 100); if (isCredit) { account.Execute(new CreditBankAccount(amount)); } else { account.Execute(new DebitBankAccount(amount)); } foreach (var @event in account.PendingEvents) { Console.WriteLine(@event); } Console.WriteLine($"Current balance is {account.Balance.ToString("c")}"); Console.WriteLine(""); await _repository.Save(account); await Task.Delay(1000); } Console.WriteLine("Reading back events directly from event store:"); Console.WriteLine(""); Console.WriteLine("No\tType\tMessage"); foreach (var @event in await _eventStore.GetEvents(1, 100)) { Console.WriteLine($"{@event.EventNumber}\t{@event.EventType}\t{@event.Data}"); } }
public async Task When_flow_is_opened_user_is_assigned_to_a_club() { var aggregateManager = Sys.ActorOf(Props.Create(() => new AggregateManager())); var aggregateManagerRef = new AggregateManagerRef(aggregateManager); var userClubAssignmentService = new UserClubAssignmentService(aggregateManagerRef, Sys); var flowUnderTest = userClubAssignmentService.AssignmentFlow; var queue = userClubAssignmentService.Queue; var materializer = Sys.Materializer(); var probe = this.SinkProbe <AssignmentSummary>(); var id = new Guid("1c041a27-0c61-414e-a002-30706b3411fd"); var name = $"testUser"; var email = $"*****@*****.**"; var registerUser = new RegisterUser(id, name, email, "SE", "1234567890"); var savings = 20; var credit = 14; var openAccount = new OpenBankAccount(id, savings, credit); aggregateManager.Tell(registerUser, ActorRefs.NoSender); aggregateManager.Tell(openAccount, ActorRefs.NoSender); var assignmentCommand = new AssignUserToClubFlow { UserId = id, AggregateManager = aggregateManager }; using (materializer) { var flow = queue .Via(flowUnderTest) .ToMaterialized(probe, Keep.Both) .Run(materializer); var q = flow.Item1; var sink = flow.Item2; var result = await q.OfferAsync(assignmentCommand); sink.Request(1); //sink.RequestNext(); sink.ExpectNext <AssignmentSummary>(x => x.Email == email && x.NetWorth == savings - credit); } }