使用简单的方法返回任务是一个好习惯:
public class MessageService : IMessageService
{
public Task<IEnumerable<Message>> DownloadMessagesTask()
{
return MyWebClient.GetMessages();
}
现在,我想在本地存储中添加缓存:
public Task<bool> WriteMessagesTask(IEnumerable<Message> list)
{
return MyIsoStorageManager.Write(list);
}
// same for reading
最天真的方式是从viewmodel调用它们:
public async void Init()
{
var result = await messageService.ReadMessagesTask();
if (result == null)
{
MessagesList = await messageService.DownloadMessagesTask();
var writingResult = await messageService.WriteMessagesTask(MessagesList);
}
但是如何将这个逻辑存储在服务中,只是为了避免代码在另一个视图模型中重复?或者我应该保持服务清洁并在视图模型中调用任务?
答案 0 :(得分:3)
从您的服务中公开一个方法,该方法包含您现在拥有的async void Init()
内容并从VM中调用它。您还可以提取接口并在viewmodel中注入(通过构造函数或属性)。
META
public class MyViewModel
{
public MyViewModel()
:this(new Service())
{}
public MyViewModel(IService service)
{
Service = service;
Initialize();
}
public IService Service { get; set; }
private async void Initialize()
{
// Fire forget
await Service.DoSomething();
}
}
META
public interface IService
{
// change if you need to return something
Task DoSomething();
}
public Service : IService
{
public async Task DoSomething()
{
var result = await ReadMessagesAsync();
if (result == null)
{
var messages = await DownloadMessagesAsync();
await WriteMessagesAsync(messages);
}
}
// private read/write/download methods here...
}
答案 1 :(得分:0)
也许您将这些方法冷分解为一些辅助类,并在视图模型中使用它们。或者,如果您已经有一些基本的viewmodel类(例如,对于INotifyPropertyChanged),您可以将它们移动到那里,假设它们主要用于视图模型。
摆脱异步后的空白。因为它是&#34; fire and forget&#34;,你基本上启动了方法,但无法控制何时完成。在某些情况下可以,但如果可以,请避免使用它。