簡體   English   中英

使用模型等待多個調用

[英]awaiting multiple calls using Models

我有一個項目。 我正在研究用戶可以將多個帳戶綁定到他/她的個人資料的地方。 但是,要獲取帳號和帳戶名,有一個端點可以調用。 要獲取每個帳號的帳戶余額,需要調用另一個端點。 現在這是我的問題。 根據設計,我需要在每張卡上放置帳號和帳戶余額,因為帳戶可以不止一個。 所以,我的問題是,我怎樣才能最好地實現這一目標? 撥打電話以獲取帳戶詳細信息,然后選擇每個帳號進行另一個調用,該電話將返回該特定帳號的帳戶余額。

這是我的模型:

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;


    }

然后我有一個服務 class,它發送和訂閱從 model 發送的帳號。這是我的服務類:

 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);
        }

    }

請任何人知道如何最好地與 go 聯系,或者如何才能達到預期的結果, 在此處輸入圖像描述

你的 model 里面應該沒有業務邏輯; 模型應該只用於存儲或傳遞數據。 設計您的模型以表示將在應用程序中呈現的數據的確切結構。 當加載需要特定類型數據的應用程序部分時,使用服務方法異步檢索所有數據,然后使用檢索數據創建或更新 model(或模型)的實例。 您需要為您的 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
  }
}

然后,每當您需要加載 model 時,您只需調用GetAccountDetails方法並提供所需的任何信息(我在本例中假設為accountNumber )並等待它返回的任務。 假設我正確理解您的問題,等待該任務的結果將包含 model,余額存儲在Balance屬性中。

因此,在一遍又一遍地查看問題之后,我決定通過等待第一個任務來嘗試安德魯的想法,獲得一個成功的響應,然后等待第二個任務,在成功時,將余額插入集合中。 所以,這就是我的 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;


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM