在转到breeze控制器之前验证breeze save bundle

时间:2015-01-30 08:20:22

标签: validation repository breeze savechanges

无处不在我看到在保存到数据库之前验证响应,在微风中,它们会覆盖BeforeSaveEntity或BeforeSaveValidation。 例如breezejs issues with the save bundle。无论如何我们可以在调用saveChanges()之前验证savebundle,就像在存储库级别一样?

我想将JObject savebundle从控制器传递到相关的存储库并在那里做一些事情: 1)检查用户是否有权保存此实体 2)进行业务逻辑级验证 3)执行实体级操作,例如更新changedDate和changedUser,将默认值添加到其他实体等...

这些更像是业务逻辑级操作,在我们的应用程序中,我们有20多个这样的实体可以从应用程序的不同部分保存。如果我们重写BeforeSaveEntity(),我们正在为DataContext中的所有实体执行所有此类业务逻辑级验证。喜欢

`if (entityInfo.Entity.GetType() == typeof(MyEntityTypeModel)) {
 }`

我不认为20多个实体的其他或案例条件是否是一个好的设计。此外,我们通过使用存储库明确区分了关注点,所以我认为应该这样做。

在这种情况下,我们如何操纵/验证savebundle?

1 个答案:

答案 0 :(得分:1)

使用 BeforeSaveEntities 方法(此处记录:http://www.getbreezenow.com/breeze-sharp-documentation/contextprovider)。使用此方法,您可以使用指定类型的所有实体,而无需对每个实体执行“if”测试。

代码可能如下所示:

ContextProvider.BeforeSaveEntitiesDelegate = CheckFreightOnOrders;
return ContextProvider.SaveChanges(saveBundle);

private Dictionary<Type, List<EntityInfo>> CheckFreightOnOrders(Dictionary<Type, List<EntityInfo>> saveMap) {
  List<EntityInfo> entityInfos;
  // extract just those entities of type 'Order'
  if (saveMap.TryGetValue(typeof(Order), out orderEntityInfos)) {
    // then iterate over them.
    foreach (var entityInfo in orderEntityInfos) {
      CheckFreight(entityInfo);
    }
  }

  return saveMap;
}