예제 #1
0
            public async Task <BankAccountGrainState> Close(BankAccountGrainState state)
            {
                var stateMachineData  = BankAccountData.NewBalance(Balance.ZeroBalance);
                var stateMachineState = BankAccountState.ClosedState;

                return(await Task.FromResult(new BankAccountGrainState(stateMachineData, stateMachineState)));
            }
예제 #2
0
            public async Task <BankAccountGrainState> Deposit(BankAccountGrainState state, Amount amount)
            {
                var newBalance = state.StateMachineData.Match(_ => _.Item.Deposit(amount));

                var stateMachineData  = BankAccountData.NewBalance(newBalance);
                var stateMachineState = BankAccountState.ActiveState;

                return(await Task.FromResult(new BankAccountGrainState(stateMachineData, stateMachineState)));
            }
 private static async Task <BankAccountGrainState> ActiveStateProcessor(
     BankAccountGrainState state,
     BankAccountMessage message)
 =>
 await
 message.Match(
     HandleInvalidMessage,
     ActiveStateMessageDelegator.HandleActiveStateDepositMessage(state),
     ActiveStateMessageDelegator.HandleActiveStateWithdrawMessage(state));
        private static async Task <BankAccountGrainState> OverdrawnStateProcessor(
            BankAccountGrainState state,
            BankAccountMessage message)
        {
            var messageHandler = new OverdrawnStateMessageHandler();

            return
                (await
                 message.Match(
                     () => { throw new InvalidMessage(); },
                     _ => messageHandler.Deposit(state, _),
                     _ => { throw new InvalidMessage(); }));
        }
예제 #5
0
        private static async Task <BankAccountGrainState> ZeroBalanceStateProcessor(
            BankAccountGrainState state,
            BankAccountMessage message)
        {
            var messageHandler = new ZeroBalanceStateMessageHandler();

            return
                (await
                 message.Match(
                     () => messageHandler.Close(state),
                     _ => messageHandler.Deposit(state, _),
                     _ => messageHandler.Withdraw(state, _)));
        }
            public Task <ActiveWithdrawResult> Withdraw(BankAccountGrainState state, Amount amount)
            {
                var newBalance = state.StateMachineData.Match(_ => _.Item.Withdraw(amount));

                var stateMachineData = BankAccountData.NewBalance(newBalance);

                var stateMachineState = newBalance.IsZeroBalance
                    ? ActiveWithdrawResultState.ZeroBalanceState
                    : (newBalance.IsOverdrawnBalance
                        ? ActiveWithdrawResultState.OverdrawnState
                        : ActiveWithdrawResultState.ActiveState);

                return(Task.FromResult(new ActiveWithdrawResult(stateMachineData, stateMachineState)));
            }
            public static Func <Amount, Task <BankAccountGrainState> > HandleActiveStateWithdrawMessage(BankAccountGrainState state) =>
            async _ =>
            {
                var result = await _handler.Withdraw(state, _);

                return((BankAccountGrainState)(result));
            };
예제 #8
0
 private static Task <BankAccountGrainState> ClosedStateProcessor(
     BankAccountGrainState state,
     BankAccountMessage message)
 {
     throw new InvalidMessage(message);
 }