2016-07-13 15 views
1

我不認爲Azure的移動服務SDK(特別是離線同步內容)中具有即用型模型/屬性驗證。Azure移動服務的客戶端模型驗證

可以在服務器上執行驗證,但我們也想在客戶端上執行驗證和清理,就像爲Web應用程序所做的那樣。

所以我們習慣在客戶端使用類似sqlite-net(或類似的東西)的東西不可用。對於例如

[Max(42)] 
public int Foo { get; set; } 

[Min(1)] 
public int Bar { get; set; } 

[Required] 
[MaxLength(42)] 
public string Baz { get; set; } 

// and so on 

所以我們需要做一些自定義的事情。驗證屬性本身是容易實現的,是這樣的:

[AttributeUsage (AttributeTargets.Property)] 
public class MaxAttribute : Attribute { 
    public int Value { get; private set; } 
    public MaxAttribute (int value) { 
    Value = value; 
    } 
} 

但需要這些類型的屬性,而被檢查的地方,我不知道在那裏會是一個好地方。

對於CRUD操作和推拉同步有異步調用。人們還需要考慮模型/屬性驗證失敗後會發生什麼情況,並推測中止推進。但是由於存在簡單的批量推送攔截器,這取決於是否使用「同步處理程序」,因此會變得棘手。

我從來沒有必要寫我自己的驗證到現在。因此,對於那些做過類似工作的人... 哪裏可以做一個檢查這些屬性的好地方?

+0

也許有一種方法可以使用'System.ComponentModel.DataAnnotations',但我懷疑這是PCL,所以probbaly在Xamarin移動應用程序中不起作用。 –

+1

如果您編寫自定義本地商店,則可以在那裏進行更新驗證。在同步處理程序中進行驗證可能太晚了,因爲用戶已經進行了更改並且現在想要同步它們。爲什麼不在UI本身進行驗證? –

回答

1

當我生成Xamarin應用程序時,我創建了一個接口(說ITable<T>),其中有CRUD實現(即AddRecord(T item))。然後我會有一個實現接口的具體實現(例如AzureTable)。這似乎是不必要的開銷,但我可以使用MockTable作爲具體的實現並實現一個模擬數據表,這樣我就可以測試而不用擔心後端。

這個具體的實現是做這種檢查的好地方。它使您能夠使用Azure移動應用程序分發和支持的現有SQLite存儲。

在我的例子中,我會做public class AzureTodoItemTable : ITable<TodoItem>,然後執行AddRecord(TodoItem item) - 檢查當時的約束。

+0

啊,這是我需要的線索。所以你說的是所有的驗證邏輯都應該被執行(直接在存儲庫類中,或者在@lindydonna建議的自定義緩存中),以防止LOCAL存儲中的LOCAL更改。不是在同步之前/期間,因爲這不僅太晚了,而且理論上你已經通過讓它潛入你的本地緩存中隱含地接受了數據的有效性。 –

+0

對於讀這個的人來說,我已經「借用」了一些'DataAnnotation'驗證器,並將它們用作模型屬性的屬性。然後實現類型化的存儲庫類,如'ITable '或'ICustomerRepository'等,它們在以下操作中具有檢查約束的鉤子:添加,更新和刪除(如果有關係,但會變得棘手)。你需要運行一些反射來找到裝飾的屬性,但它很快並且在客戶端,所以不用擔心。您只能進行屬性驗證,或者喜歡花點時間並在服務器上進行全模型驗證。 –