gpt4 book ai didi

breeze - 使用自定义 EFContextProvider 进行服务器端验证

转载 作者:行者123 更新时间:2023-12-04 04:54:44 30 4
gpt4 key购买 nike

看完后Custom EFContextProvider并实现它,我仍在尝试找出执行服务器端验证的最佳方法以及如何在保存之前应用业务规则......也就是说,我的问题围绕着应该被覆盖的 2 种方法:

  • protected override bool BeforeSaveEntity(EntityInfo entityInfo) { //}
  • protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) { // }

  • 我知道文档指定“在调用 BeforeSaveEntities 方法之前将为每个实体调用BeforeSaveEntity 方法”一次。此外,我的问题围绕着在具有特定领域关系的多个实体上验证/应用业务规则而不必验证单个实体的属性(为此,我相信自定义验证可以作为 explained here )

    所以我的问题是:
  • 如何从服务器返回验证错误?
    一旦我应用了业务规则,如果它们失败了,我该如何向一个或多个实体添加验证错误?
  • 如何传递某种验证上下文,以便服务器端代码“知道”要应用哪些业务规则?
    我的应用程序可以在几个不同的地方添加新客户,并且根据应用程序上下文,应该应用业务规则还是可选的。例如,如果有一个明确的“添加新客户”屏幕以及“打印检查”屏幕,允许“即时”创建新客户(在这种情况下,必须检查更多规则)。这可能不是理想的设计,但它是必需的。很少有其他地方也可以创建客户......不过在服务器端,我没有得到这个“上下文”来决定如何应用(以及按什么顺序)业务规则......此外,我不能使用检查我在 saveMap 中有哪些实体的逻辑(在 BeforeSaveEntities 的情况下)以确定上下文,因为这不是确定性的(对于不同的应用程序上下文,saveMap 可能具有相同的实体)

  • 谢谢
    兹...

    最佳答案

    1) 通常,将“自定义”验证错误从服务器返回到客户端的最简单方法是简单地在服务器上抛出错误。我还没有尝试过但认为可能有效的是,如果您希望将该错误应用于特定实体,请创建一个异常,其中包含一个属性,该属性包含失败并抛出此异常的实体/实体的 EntityKey。在客户端,您应该能够在 promise 失败分支中检索此错误,并将验证错误自己应用于特定实体。 (顺便说一句,这听起来确实是对 Breeze 的合理功能请求,以简化此过程。请将其发布在 Breeze User Voice 上,以便我们评估社区的兴趣。)

    2)您有两种方法可以将“上下文”应用于保存。最简单的是通过 SaveOptions.tag 属性。此属性可以在客户端上设置,并将在服务器上反序列化以通过 SaveOptions 属性在您的 ContextProvider 中使用。 (像这样):

     public class NorthwindContextProvider : EFContextProvider<NorthwindIBContext_EDMX_2012> {

    protected override bool BeforeSaveEntity(EntityInfo entityInfo) {
    if ((string)SaveOptions.Tag == "myCustomSaveSetting") {

    }
    }

    另一种方法是为您保存的每个“版本”创建一个完全独立的端点。您可以通过 SaveOptions 实例的“resourceName”属性执行此操作。
     var so = new SaveOptions({ resourceName: "MyCustomSave" });
    return myEntityManager.saveChanges(null, so);

    将转到“MyCustomSave” Controller 方法而不是标准的“SaveChanges”方法。即
    public class NorthwindIBModelController : ApiController {

    [HttpPost]
    public SaveResult MyCustomSave(JObject saveBundle) {
    ContextProvider.BeforeSaveEntitiesDelegate = MyCustomBeforeSaveEntities;
    return ContextProvider.SaveChanges(saveBundle);
    }

    private Dictionary<Type, List<EntityInfo>> MyCustomBeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) {
    // your code...
    }
    }

    关于breeze - 使用自定义 EFContextProvider 进行服务器端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921819/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com