Exemplo n.º 1
0
        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>();
        });
Exemplo n.º 2
0
        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}");
            }
        }
Exemplo n.º 3
0
        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);
            }
        }