【问题标题】:Client-side model validation for Azure mobile servicesAzure 移动服务的客户端模型验证
【发布时间】:2016-07-13 08:39:28
【问题描述】:

我认为 Azure 的移动服务 SDK 中没有开箱即用的模型/属性验证(特别是离线同步的东西)。

可以在服务器上执行验证,但我们也希望在客户端上执行验证和清理,就像对 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 操作以及推送和拉取同步有异步调用。还需要考虑模型/属性验证失败后会发生什么,并且可能会中止推送。但它变得很棘手,因为有简单的批量推送拦截器,具体取决于是否使用“同步处理程序”。

到目前为止,我从来不需要编写自己的验证。所以对于那些做过类似事情的人... 哪里是检查这些属性的好地方?

【问题讨论】:

  • 也许有一种方法可以使用 System.ComponentModel.DataAnnotations,但我怀疑那是 PCL,因此可能无法在 Xamarin 移动应用程序中使用。
  • 如果您编写自定义本地存储,您可以在那里对更新进行验证。在同步处理程序中进行验证可能为时已晚,因为用户已经进行了更改并且现在想要同步它们。为什么不在 UI 本身中进行验证?

标签: c# validation azure-mobile-services model-validation


【解决方案1】:

当我生成 Xamarin 应用程序时,我创建了一个接口(比如 ITable<T>),其中包含 CRUD 实现(即 AddRecord(T item))。然后我将有一个实现接口的具体实现(例如 AzureTable)。这似乎是不必要的开销,但我可以使用 MockTable 作为具体实现并实现模拟数据表,这样我就可以测试而不必担心后端。

这个具体的实现是进行这种检查的好地方。它使您能够使用 Azure 移动应用分发和支持的现有 SQLite 存储。

在我的示例中,我会执行 public class AzureTodoItemTable : ITable<TodoItem> 然后实现 AddRecord(TodoItem item) - 检查此时的约束。

【讨论】:

  • 啊,这正是我需要的线索。因此,您要说的是所有验证逻辑都应针对本地存储中的本地更改执行(直接在存储库类中,或在@lindydonna 建议的自定义缓存中)。不要在同步之前/期间,因为这不仅为时已晚,而且理论上你已经通过让数据潜入本地缓存来隐式接受数据的有效性。
  • 对于其他阅读本文的人,我已经“借用”了一些 DataAnnotation 验证器,并将它们用作模型属性的属性。然后实现类型化的存储库类,如ITable<T>ICustomerRepository 等,它们具有用于在以下操作期间检查约束的钩子:添加、更新和删除(如果您有关系,但它会变得棘手)。您需要运行一些反射来找到修饰的属性,但它很快并且在客户端,所以不用担心。您可以只进行属性验证,也可以像在服务器上一样进行全模型验证。
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多