0

我有一个项目。我正在研究用户可以将多个帐户绑定到他/她的个人资料的位置。但是,要获取帐号和帐户名称,需要调用一个端点。要获取每个帐号的帐户余额,需要调用另一个端点。现在这是我的问题。根据设计,我需要在每张卡上放置帐号和帐户余额,因为帐户可以多个。所以,我的问题是,我怎样才能最好地做到这一点?拨打电话以获取帐户详细信息,然后选择每个帐号以进行另一个调用,该电话将返回该特定帐号的帐户余额。

这是我的模型:

public class MyAccount
{
    public string linkerId { get; set; }
    [JsonProperty("accountDetails")]
    public AccountDetails Details { get; set; }
    public AcctUserDetails acctUserDetails { get; set; }
    public LinkedBy linkedBy { get; set; }
    public string requestTimestamp { get; set; }
    
}

public class Account
{
    [JsonProperty("payload")]
    public List<MyAccount> Accounts { get; set; }
}
public class AccountDetails
{
    string acctBalance;

    [JsonProperty("accountNumber")]
    public string AccountNumber { get; set; }

    [JsonProperty("accountName")]
    public string AccountName { get; set; }
    public string phoneNumber { get; set; }
    public string email { get; set; }

    [JsonProperty("accountType")]
    public string AccountType { get; set; }
    public string Balance
    {
        get
        {
            foreach (var accountNumm in AccountNumber)
            {
                MessagingCenter.Send<object, string>(this, "acctNo", AccountNumber);
                
            }
            MessagingCenter.Subscribe(this, "myAcctNo", (object obj, string theBalance) =>
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        acctBalance = theBalance;

                    });

                });
            var newBall = acctBalance;
            return newBall;
        }
        set { Balance = value; }
    }
}

此外,My ViewModel 调用 API 以获取所有帐户。

private async void LoadMyAccounts()
    {
        IsBusy = true;
        HttpClient client = new HttpClient();
        var url = Constant.GetLinkedAccountsUrl;
        var response = await client.GetAsync(url);

        var json = await response.Content.ReadAsStringAsync();

        Account userAccounts = JsonConvert.DeserializeObject<Account>(json);
        var sorted = userAccounts.Accounts;
        //getTrans = userTransactions
        var allAccounts = new ObservableCollection<MyAccount>(sorted);
        AccountsData = allAccounts;

        IsBusy = false;


    }

然后我有一个服务类,它发送和订阅从模型发送的帐号。这是我的 serviceClass :

 public async void GetBalance()
    {
        HttpClient client = new HttpClient();
        var url = Constant.GetAcctBalanceUrl + acctBalance;
        var response = await client.GetAsync(url);

        var json = await response.Content.ReadAsStringAsync();

        if (response.IsSuccessStatusCode)
        {
            var pro = JsonConvert.DeserializeObject<AcctModel>(json);
            var newBal = pro.Balances;
            Constant.MyBalance = newBal;
            var acctNo = newBal.accountBalance;
            MessagingCenter.Send<object, string>(this, "myAcctNo", acctNo);
        }

    }

请任何人知道如何最好地做到这一点或如何做才能达到预期的结果,在此处输入图像描述

4

2 回答 2

0

您的模型中不应包含业务逻辑;模型应该只用于存储或传递数据。设计您的模型以表示将在应用程序中呈现的数据的确切结构。在加载需要特定类型数据的应用程序部分时,使用服务方法异步检索所有数据,然后使用检索数据创建或更新模型的实例。您将需要为您的 UI 实现某种方式来指示它同时正在加载数据,例如通过隐藏一些控件并用微调器替换它们。

理想情况下,如果您有适当的关注点分离,您的代码可能如下所示:


// Model

public class AccountDetails
{
  public string AccountNumber { get; set; }
  public string AccountName { get; set; }
  public string Balance { get; set; }

  // ...
}

// Service

public class AccountService
{
  public async Task<AccountDetails> GetAccountDetails(string accountNumber)
  {
    using var client = new HttpClient();
    var url = Constant.GetAccountBalanceUrl + accountNumber;
    var response = await client.GetAsync(url);

    response.EnsureSuccessStatusCode();

    var json = await response.Content.ReadAsStringAsync();
    var model = JsonConvert.DeserializeObject<AccountDetails>(json);
    
    model.Balance = await GetAccountBalance(accountNumber);

    return model;
  }

  public async Task<string> GetAccountBalance(string accountNumber)
  {
    // similar approach as above to get the account balance, as it sounds like it
    // may come from a different source based on your question
  }
}

然后,每当您需要加载模型时,您只需GetAccountDetails使用所需的任何信息调用该方法(我accountNumber在此示例中假设)并等待它返回的任务。Balance假设我正确理解您的问题,等待该任务的结果将包含模型,其中余额存储在属性中。

于 2020-10-26T20:25:22.837 回答
0

所以,看了一遍又一遍的问题,我决定试试andrew的想法,等待第一个任务,得到一个successResponse,然后等待第二个任务,成功后,将余额插入集合中。所以,这就是我的 ViewModel 在这个过程之后的样子......

        private async void LoadMyAccounts()
    {
        IsBusy = true;
        HttpClient client = new HttpClient();
        var url = Constant.GetLinkedAccountsUrl;
        var response = await client.GetAsync(url);

        var json = await response.Content.ReadAsStringAsync();

        Account userAccounts = JsonConvert.DeserializeObject<Account>(json);

        List<MyAccount> sorted = userAccounts.Accounts;
        //getTrans = userTransactions
        var allAccounts = new ObservableCollection<MyAccount>(sorted);
        AccountsData = allAccounts;
        acctCounts = AccountsData.Count;

        //List<MyAccount> BalanceArray = new List<MyAccount>();

        foreach (var acct in userAccounts.Accounts)
        {
            string newAcctNo = acct.Details.AccountNumber;

            HttpClient clientee = new HttpClient();
            var urlee = Constant.GetAcctBalanceUrl + newAcctNo;
            var responseee = await clientee.GetAsync(urlee);

            responseee.EnsureSuccessStatusCode();

            var jsonee = await responseee.Content.ReadAsStringAsync();
            var model = JsonConvert.DeserializeObject<AcctModel>(jsonee);
            
            MyAccount ball = model.Balances;

            acct.accountBalance = ball.accountBalance;
            //AccountsData.Add(ball);

        }




        IsBusy = false;


    }
于 2020-11-02T12:03:02.470 回答