C# 使用模型等待多个调用

C# 使用模型等待多个调用,c#,xamarin,xamarin.forms,messagingcenter,C#,Xamarin,Xamarin.forms,Messagingcenter,我有一个项目。我正在研究一个用户可以将多个帐户绑定到他/她的个人资料。但是,要获取帐号和帐户名,需要调用一个端点。要获取每个帐号的帐户余额,需要调用另一个端点。 现在我的问题来了。根据设计,我需要在每张卡上放置账号和账户余额,因为账户可以不止一个。 所以,我的问题是,我如何才能最好地实现这一点?拨打电话获取帐户详细信息,然后选择每个帐户号码拨打另一个电话,该电话将返回该特定帐户号码的帐户余额 以下是我的模型: public class MyAccount { public string

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

以下是我的模型:

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; }
    }
}
公共类MyAccount
{
公共字符串linkerId{get;set;}
[JsonProperty(“accountDetails”)]
公共帐户详细信息{get;set;}
公共accuserdetails accuserdetails{get;set;}
公共LinkedBy LinkedBy{get;set;}
公共字符串请求时间戳{get;set;}
}
公共类帐户
{
[JsonProperty(“有效载荷”)]
公共列表帐户{get;set;}
}
公共类帐户详细信息
{
弦平衡;
[JsonProperty(“accountNumber”)]
公共字符串AccountNumber{get;set;}
[JsonProperty(“accountName”)]
公共字符串AccountName{get;set;}
公共字符串phoneNumber{get;set;}
公共字符串电子邮件{get;set;}
[JsonProperty(“accountType”)]
公共字符串AccountType{get;set;}
公共字符串余额
{
得到
{
foreach(AccountNumber中的var accountNumm)
{
MessagingCenter.Send(这是“acctNo”,AccountNumber);
}
订阅(这是“myAcctNo”,(对象obj,字符串theBalance)=>
{
Device.beginInvokeMainThread(()=>
{
acctBalance=余额;
});
});
var newBall=账户余额;
返回新球;
}
设置{Balance=value;}
}
}
此外,我的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;


    }
private async void LoadMyAccounts()
{
IsBusy=true;
HttpClient=新的HttpClient();
var url=Constant.GetLinkedAccountsUrl;
var response=wait client.GetAsync(url);
var json=await response.Content.ReadAsStringAsync();

Account userAccounts=JsonConvert.DeserializeObject

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

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


//模型
公共类帐户详细信息
{
公共字符串AccountNumber{get;set;}
公共字符串AccountName{get;set;}
公共字符串余额{get;set;}
// ...
}
//服务
公营会计服务
{
公共异步任务GetAccountDetails(字符串accountNumber)
{
使用var client=new HttpClient();
var url=Constant.GetAccountBalanceUrl+accountNumber;
var response=wait client.GetAsync(url);
response.EnsureSuccessStatusCode();
var json=await response.Content.ReadAsStringAsync();
var model=JsonConvert.DeserializeObject(json);
model.Balance=等待GetAccountBalance(accountNumber);
收益模型;
}
公共异步任务GetAccountBalance(字符串accountNumber)
{
//类似的方法如上所述,以获得帐户余额,因为它听起来像
//根据您的问题,可能来自不同的来源
}
}

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

因此,在反复研究问题之后,我决定尝试andrew的想法,等待第一个任务,获得成功响应,然后等待第二项任务成功后,将余额插入集合。 下面是我的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;


    }
private async void LoadMyAccounts()
{
IsBusy=true;
HttpClient=新的HttpClient();
var url=Constant.GetLinkedAccountsUrl;
var response=wait client.GetAsync(url);
var json=await response.Content.ReadAsStringAsync();
Account userAccounts=JsonConvert.DeserializeObject(json);
列表排序=userAccounts.Accounts;
//getTrans=userTransactions
var allAccounts=新的可观察集合(已排序);
账户数据=所有账户;
acctCounts=AccountsData.Count;
//列表余额数组=新列表();
foreach(userAccounts.Accounts中的var acct)
{
字符串newAcctNo=acct.Details.AccountNumber;
HttpClient客户端=新的HttpClient();
var urlee=Constant.GetAcctBalanceUrl+newAcctNo;
var responseee=wait clientee.GetAsync(urlee);
responseee.EnsureSuccessStatusCode();
var jsonee=await responseee.Content.ReadAsStringAsync();
var model=JsonConvert.DeserializeObject(jsonee);
MyAccount ball=模型余额;
acct.accountBalance=ball.accountBa
        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;


    }