gpt4 book ai didi

.net - 静态存储库是使用 NHibernate 的正确方法吗?

转载 作者:行者123 更新时间:2023-12-03 23:57:54 26 4
gpt4 key购买 nike

我花了晚上剩下的时间阅读 StackOverflow 问题以及一些有关该主题的博客条目和链接。结果证明他们都非常有帮助,但我仍然觉得他们并没有真正回答我的问题。

所以,我正在开发一个简单的 Web 应用程序。我想创建一个可重用的数据访问层,以后可以在其他解决方案中重用。其中 99% 将是 Web 应用程序。这似乎是我学习 NHibernate 和一些围绕它的模式的好借口。

我的目标如下:

  • 我不希望业务逻辑层了解有关数据库内部工作的任何信息,也不希望 NHibernate 本身。
  • 我希望业务逻辑层对数据访问层有尽可能少的假设。
  • 我希望数据访问层尽可能简单易用。这将是一个简单的项目,所以我不想让任何事情变得过于复杂。
  • 我希望数据访问层尽可能非侵入性。

  • 将这一切牢记在心,我决定使用流行的存储库模式。我在这个网站和各种开发博客上读到了这个主题,我听说了一些关于工作单元模式的东西。

    我还环顾四周并检查了各种实现。 (包括 FubuMVC contrib 和 SharpArchitecture 以及一些博客上的内容。)我发现它们中的大多数都以相同的原则运行:它们创建一个“工作单元”,在实例化存储库时实例化,然后启动事务,做一些事情,并提交,然后重新开始。所以,只有一个 ISessionRepository就是这样。然后客户端代码需要实例化一个存储库,用它做一些事情,然后处理。

    这种使用模式不符合我尽可能简单的需求,所以我开始考虑其他事情。

    我发现 NHibernate 已经有了一些使自定义“工作单元”实现变得不必要的东西,那就是 CurrentSessionContext类。如果我正确配置了 session 上下文,并在必要时进行了清理,我就可以开始了。

    所以,我想出了这个:

    我有一个名为 NHibernateHelper 的内部静态类.首先,它有一个名为 CurrentSessionFactory 的静态属性。 ,它在第一次调用时实例化 session 工厂并将其存储在静态字段中。 (一个 ISessionFactory 每一个 AppDomain 就足够了。)然后,更重要的是,它有一个 CurrentSession静态属性,检查是否存在 ISession绑定(bind)到当前 session 上下文,如果没有,则创建一个并绑定(bind)它,然后返回 ISession绑定(bind)到当前 session 上下文。

    因为它将主要用于 WebSessionContext (所以,一个 ISessionHttpRequest ,虽然对于单元测试,我配置了 ThreadStaticSessionContext ),它应该可以无缝工作。在创建和绑定(bind)一个 ISession 之后,它将事件处理程序挂接到 HttpContext.Current.ApplicationInstance.EndRequest事件,负责清理 ISession请求结束后。 (当然,它只有在真正运行在 Web 环境中时才会这样做。)

    因此,通过所有这些设置, NHibernateHelper将始终能够返回有效的 ISession ,因此无需为“工作单元”实例化 Repository 实例即可正常运行。相反, Repository是一个与 ISession 一起操作的静态类来自 NHibernateHelper.CurrentSession属性,并通过泛型方法公开功能。

    所以,基本上,我最终得到了两个非常懒惰的单例。

    我很好奇,你怎么看这个?
    这是一种有效的思维方式,还是我完全偏离了轨道?

    编辑:
    我必须指出 NHibernateHelper 类是内部的,因此对于存储库的使用者来说几乎是不可见的。

    另一个想法是,为了在解决方案中引入依赖注入(inject),制作一个名为 IDataProvider的接口(interface)。 ,并在第一次调用 Repository 时实例化它的一个实例类。 (但是,实现代码也应该能够处理上下文的概念。)

    编辑 2:
    好像很多人喜欢我的想法,但是答案中关于它的意见仍然太少。
    我可以假设这是使用 NHibernate 的正确方法吗? :P

    最佳答案

    就其值(value)而言,Sharp Architecture 或多或少都在按照您的建议做。它最终为每个 HTTP 请求提供一个 session (更准确地说,每个 HTTP 请求每个数据库一个 session )。您的方法当然是有效的,并且每个请求也提供一个 session 。我更喜欢 SharpArch 通过 DI 的更清晰的 OO 方法,而不是使用静态存储库和帮助程序类。

    关于.net - 静态存储库是使用 NHibernate 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2717379/

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