// Note: the data types used in this sample are generated from data.proto in GrpcServiceSample
        public override async Task RunAsync(CancellationToken cancellationToken)
        {
            using var client = new DaprClientBuilder().Build();

            Console.WriteLine("Invoking grpc deposit");
            var deposit = new GrpcServiceSample.Generated.Transaction()
            {
                Id = "17", Amount = 99
            };
            var account = await client.InvokeMethodGrpcAsync <GrpcServiceSample.Generated.Transaction, Account>("grpcsample", "deposit", deposit, cancellationToken);

            Console.WriteLine("Returned: id:{0} | Balance:{1}", account.Id, account.Balance);
            Console.WriteLine("Completed grpc deposit");

            Console.WriteLine("Invoking grpc withdraw");
            var withdraw = new GrpcServiceSample.Generated.Transaction()
            {
                Id = "17", Amount = 10,
            };
            await client.InvokeMethodGrpcAsync("grpcsample", "withdraw", withdraw, cancellationToken);

            Console.WriteLine("Completed grpc withdraw");

            Console.WriteLine("Invoking grpc balance");
            var request = new GetAccountRequest()
            {
                Id = "17",
            };

            account = await client.InvokeMethodGrpcAsync <GetAccountRequest, Account>("grpcsample", "getaccount", request, cancellationToken);

            Console.WriteLine($"Received grpc balance {account.Balance}");
        }
Beispiel #2
0
        /// <summary>
        /// Deposit
        /// </summary>
        /// <param name="transaction"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <GrpcServiceSample.Generated.Account> Deposit(GrpcServiceSample.Generated.Transaction transaction, ServerCallContext context)
        {
            _logger.LogDebug("Enter deposit");
            var state = await _daprClient.GetStateEntryAsync <Models.Account>(StoreName, transaction.Id);

            state.Value ??= new Models.Account()
            {
                Id = transaction.Id,
            };
            state.Value.Balance += transaction.Amount;
            await state.SaveAsync();

            return(new GrpcServiceSample.Generated.Account()
            {
                Id = state.Value.Id, Balance = (int)state.Value.Balance,
            });
        }
Beispiel #3
0
        /// <summary>
        /// Withdraw
        /// </summary>
        /// <param name="transaction"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <GrpcServiceSample.Generated.Account> Withdraw(GrpcServiceSample.Generated.Transaction transaction, ServerCallContext context)
        {
            _logger.LogDebug("Enter withdraw");
            var state = await _daprClient.GetStateEntryAsync <Models.Account>(StoreName, transaction.Id);

            if (state.Value == null)
            {
                throw new Exception($"NotFound: {transaction.Id}");
            }

            state.Value.Balance -= transaction.Amount;
            await state.SaveAsync();

            return(new GrpcServiceSample.Generated.Account()
            {
                Id = state.Value.Id, Balance = (int)state.Value.Balance,
            });
        }
Beispiel #4
0
        /// <summary>
        /// implement OnTopicEvent to handle deposit and withdraw event
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task <TopicEventResponse> OnTopicEvent(TopicEventRequest request, ServerCallContext context)
        {
            if (request.PubsubName == "pubsub")
            {
                var input       = JsonSerializer.Deserialize <Models.Transaction>(request.Data.ToStringUtf8(), this.jsonOptions);
                var transaction = new GrpcServiceSample.Generated.Transaction()
                {
                    Id = input.Id, Amount = (int)input.Amount,
                };
                if (request.Topic == "deposit")
                {
                    await Deposit(transaction, context);
                }
                else
                {
                    await Withdraw(transaction, context);
                }
            }

            return(await Task.FromResult(default(TopicEventResponse)));
        }