2014-09-21 92 views
1

這是一個很好的做法,有一個簡單的方法,它返回任務:運行多個任務

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 

最簡單的方式是從視圖模型打電話給他們:

public async void Init() 
    { 
     var result = await messageService.ReadMessagesTask(); 
     if (result == null) 
     { 
      MessagesList = await messageService.DownloadMessagesTask(); 
      var writingResult = await messageService.WriteMessagesTask(MessagesList); 
     } 

但我怎麼能這樣的邏輯存儲服務,只是爲了避免代碼重複在另一個viewmodels?或者我應該保持服務清潔並在視圖模型中調用任務?

+0

它以後綴的方法名的好約定返回'Task'用'Async' – 2014-09-21 10:23:37

+0

@RussCam我認爲它返回的人'Task'應後綴爲'* Task' – 2014-09-21 10:25:01

+1

請參閱http://msdn.microsoft.com/en-us/library/hh873175.aspx,具體命名,參數和返回類型 – 2014-09-21 10:27:16

回答

3

從您的服務中揭示一種方法,將您現在擁有的內容包含在async void Init()中,並從VM調用它。你也可以提取接口並將其注入視圖模型(通過構造函數或屬性)。

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... 
} 
+0

我假設你的'Service'和'MessageService'是一個服務? – 2014-09-21 11:12:42

+0

是的。以上只是直接寫入SO中的「meta」。 – 2014-09-21 11:13:48

0

也許你會冷靜地將這些方法分解成一些輔助類,並在你認爲合適的時候在視圖模型中使用它們。或者,如果你已經有了一些基本的viewmodel類(例如INotifyPropertyChanged),你可以將它們移動到那裏,假設它們主要用於視圖模型。

擺脫async後的空白。因爲它是「火和遺忘」,你基本上啓動了方法,但無法控制何時完成。在某些情況下,它是可以的,但如果可以的話避免它。

+0

中有什麼好吧,將它們存儲在輔助類中聽起來像是一種解決方法 - 我對「本地」解決方案感興趣。修復了無效問題 - 實際上,我通常會盡量避免它。 – 2014-09-21 10:21:15