2017-05-15 38 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 ...预览软件包包括对认证的更好的支持 –