2017-05-15 41 views
1

我正處於新的Xamarin Forms應用程序的規劃階段。Xamarin.Forms和離線優先

我想申請成爲首先離線

由此,我的意思是應該從本地數據存儲讀取/寫入數據。然後,只要存在連接性(即可能立即或幾小時後),數據就會在本地數據存儲和雲之間同步。

我在找的是一種標準的設計模式。我發現了一些關於這個主題的文章,但是ost是關於專有解決方案的。

This article似乎是一個非常好的開始,但它不是真的關於離線優先。有沒有人知道關於適用於Xamarin Forms,或至少.Net的離線優先主題的一些優秀文獻。

非常感謝您的時間和答案, 朱利安

回答

1

這是一個相當加載的問題,但在短,我已經在過去做了它的方法是使用一個共享的IService與所有的邏輯在共享庫。

此庫位於移動應用程序和API中,並負責處理同步。該API將具體實現(到您的回購),移動應用程序將具有具體實現(對Sqlite),並且還有一個代理實現HttpClient

至於回購,你就會有一個針對移動和一個用於服務器,並再次共享相同的IRepo

注:使用GUID的所有標識,從來沒有自動遞增,否則你會得到碰撞

例如

// everything in here lives in a shared library that the server and mobile have access to. 

public interface IUserRepository { 
    // shared methods to talk to data 
} 

public interface IUserService { 
    UserDto GetUserById(Guid userId); 
    IList<UserDto> FindUsers(int skip, int take); 
    void DeleteUserById(Guid userId); 
    // etc 
} 

public class UserService : IUserService { 
    public UserService (IUserRepository userRepo) { 
     _userRepo = userRepo; 
    } 
} 

public class UserProxyService : IUserService { 
    public UserProxyService (HttpClient httpClient) { 
     _httpClient = httpClient; // don't dispose... make singleton 
    } 
} 
// server implementation of the repo 
public namespace MyApp.Api.Data { 
    public class UserRepository : IUserRepository { 
     // sql server calls (EF maybe) 
    } 
} 
// mobile implementation of the repo 
public namespace MyApp.Mobile.Data { /* (portable) */ 
    public class UserRepository : IUserRepository { 
     // sqlite calls on the phone 
    } 
} 

至於處理同步。我的建議是在可能的情況下立即推送您的更改,如果以前的嘗試因網絡問題而失敗,則可能爲OnResume。我建議立即做這件事的原因是因爲用戶會希望隨處看到這些數據。

+0

Akavache也很棒這些種情景模式 –

+1

一定要同意,並強調使用方法:「不要使用自動遞增」。在過去,當我使用基於整數的主鍵系統進行集成時,我已經將本地主鍵設置爲負值,直到它們已經同步到服務器,並且工作得很好。 –

+0

@ deckertron_9000當您綁定到已經實現了自動增量的現有系統時,這不是一個壞主意。 –

0

您可以使用Microsoft Azure移動客戶端或Realm實現您的離線/在線數據同步。領域重要的一點是他們首先是關於離線的。雖然Azure移動客戶端很大程度上關於您的主數據庫在雲中,但可以在本地緩存該數據,以便在脫機時進行CRUD操作,然後在您恢復聯機後與您的後端進行同步。

您可以瞭解更多關於境界這裏

您可以瞭解更多有關使用Azure的移動客戶端在這裏

+0

Azure脫機同步非常複雜。我認爲構建你贏得的web服務和數據庫更容易實現。你能用天藍色的領域嗎? – batmaci

+0

我想這取決於你想如何「使用Realm」。您當然可以在Azure中創建Realm Mobile Platform。如果你想要的是Azure移動客戶端,你需要開發自己的提供者。如果它可以幫助你添加AzureMobileClient.Helpers ...預覽軟件包包括對認證的更好的支持 –