gpt4 book ai didi

asp.net-mvc - NHibernate:如何使用每个请求 session 模式处理基于实体的验证,而 Controller 不知道 ISession

转载 作者:行者123 更新时间:2023-12-03 03:36:03 27 4
gpt4 key购买 nike

在 ASP.NET MVC 中进行基于实体的验证(每个实体类都有一个 IsValid() 方法来验证其内部成员)的最佳方法是什么,使用“session-per- request”模型, Controller 对 ISession 的了解为零(或有限)?这是我正在使用的模式:

  1. 使用包装当前 NH session 的 IFooRepository 按 ID 获取实体。这将返回一个连接的实体实例。

  2. 加载来自表单帖子的可能无效数据的实体。

  3. 通过调用其 IsValid() 方法来验证实体。

  4. 如果有效,则调用 IFooRepository.Save(entity),它委托(delegate)给 ISession.Save()。否则,显示错误消息。

当前 session 在请求开始时打开,在请求结束时刷新。由于我的实体已连接到 session ,因此即使对象无效,刷新 session 也会尝试保存更改。

将验证逻辑保留在实体类中、限制 Controller 对 NH 的了解以及避免在请求结束时保存无效更改的最佳方法是什么?

<小时/>

选项 1:验证失败时显式逐出,隐式刷新:如果验证失败,我可以在操作方法中手动逐出无效对象。如果成功,我什么也不做, session 会自动刷新。

缺点:容易出错且违反直觉(“我没有调用 .Save(),为什么我的无效更改仍然被保存?”)

选项 2:显式刷新,默认情况下不执行任何操作:默认情况下,我可以在请求结束时处置 session ,仅在 Controller 指示成功时刷新。我可能会在我的基本 Controller 中创建一个 SaveChanges() 方法,该方法设置一个指示成功的标志,然后在请求结束时关闭 session 时查询该标志。

专业:如果开发人员忘记此步骤,可以更直观地进行故障排除[相对于选项 1]

缺点:我必须调用 IRepository.Save(entity)' SaveChanges()

选项 3:始终使用断开连接的对象:我可以修改我的存储库以返回断开连接/ transient 对象,并修改 Repo.Save() 方法以重新附上它们。

优点:最直观,因为 Controller 不了解 NH。

缺点:这是否会抵消我从 NH 获得的许多好处?

最佳答案

毫无疑问,选项 1。这并不违反直觉,这就是 NH 的工作原理。使用 NH 检索的对象是持久的,并且在刷新 session 时将保存更改。调用 Evict 会使对象变为 transient ,这正是您想要的行为。

您没有提及,但另一种选择可能是使用手动或提交 FlushMode。

关于asp.net-mvc - NHibernate:如何使用每个请求 session 模式处理基于实体的验证,而 Controller 不知道 ISession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2403380/

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