技术上如何访问Web服务?
架构上如何添加Model?
MVVM+IService
思路:
1. IService帮助VM干活:创建ITokenService接口,生成Model
2. 构建接口的实现TokenService
3. 如何将VM和IService关联起来?创建参数为IService的VM构造函数
4. 在VMLocator中注册IService
-
Token.cs
public class Token
{//Model层:数据
public string status { get; set; }
public string data { get; set; }
}
-
接口ITokenService.cs
public interface ITokenService
{//生成Model
Task<Token> GetTokenAsync();//async函数返回值必须是Task
}
-
接口的实现TokenService.cs
public class TokenService :ITokenService
{
public async Task<Token> GetTokenAsync()
{//TokenService具体实现
var httpClient = new HttpClient();
var response =
await httpClient.GetAsync("https://v2.jinrishici.com/token");//访问网址
var json = await response.Content.ReadAsStringAsync();//响应的内容读成字符串json
return JsonConvert.DeserializeObject<Token>(json);//把json反序列化为Token
}
}
-
MainPageViewModel.cs
public class MainPageViewModel : ViewModelBase
{
private string _result;
public string Result
{
get => _result;
set => Set(nameof(Result), ref _result, value);
}
private Token _token;
public Token Token
{
get => _token;
set => Set(nameof(Token), ref _token, value);
}
private RelayCommand _clickMeCommand;
public RelayCommand ClickMeCommand =>
_clickMeCommand ?? (_clickMeCommand =
new RelayCommand(() => Result = "Hello World!"));
****************************************************************************************
// MVVM + IService(帮ViewModel干活)
private RelayCommand _getTokenCommand;
public RelayCommand GetTokenCommand =>
_getTokenCommand ?? (_getTokenCommand =
new RelayCommand(async() =>//async函数一定要带await
{//使用TokenService帮ViewModel干活
Token = await _tokenService.GetTokenAsync();
}));
public MainPageViewModel(ITokenService tokenService)
{//创建参数为ITokenService的构造函数:保证ViewModel一定能拿到TokenService
_tokenService = tokenService;
}
private ITokenService _tokenService;
}
-
ViewModelLocator.cs
public class ViewModelLocator
{
public MainPageViewModel MainPageViewModel =>
SimpleIoc.Default.GetInstance<MainPageViewModel>();
public ViewModelLocator()
{//因为ViewModel是从ViewModelLocator里拿的,所以ViewModel需要的ITokenService也需要注册在Locator里
SimpleIoc.Default.Register<MainPageViewModel>();//注册MainPageViewModel
****************************************************************************************
SimpleIoc.Default.Register<ITokenService,TokenService>();//注册ViewModel需要的ITokenService
}
}