在閱讀了關於Custom EFContextProvider並實現它之後,我仍然試圖找出執行服務器端驗證的最佳方法以及如何在保存之前應用業務規則...即我的問題是圍繞旋轉的2種方法,都應該被否決:服務器端驗證w/Breeze JS和自定義EFContextProvider
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可能對不同的應用程序的上下文相同的實體)
由於 Z. ..
重新#1)拋出一個錯誤似乎相當反應,是否沒有辦法主動驗證服務器上並返回驗證錯誤?如何在模型實現上實現IValidatableObject - Breeze會「拾取」驗證嗎?重新#2)SaveOptions.Tag似乎是一個很好的方式來傳遞上下文,我會嘗試 – zam6ak
我剛剛添加一個額外的方法作爲一個單獨的答案。 –