相关疑难解决方法(0)

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

我花了剩下的时间阅读StackOverflow问题,还有一些关于这个主题的博客文章和链接.所有这些都证明是非常有帮助的,但我仍然觉得他们并没有真正回答我的问题.

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

我的目标如下:

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

考虑到这一切,我决定使用流行的存储库模式.我在这个网站和各种开发博客上阅读了这个主题,我听到了一些关于工作单元模式的内容.

我也环顾四周,检查了各种实现.(包括FubuMVC contrib,SharpArchitecture,以及一些博客上的内容.)我发现大多数这些操作都遵循相同的原则:它们创建了一个"工作单元",在实例化存储库时实例化,它们启动一个事务,做东西,提交,然后重新开始.所以,只有一个ISession每次Repository仅此而已.然后客户端代码需要实例化一个存储库,用它做一些东西,然后处理.

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

我发现NHibernate已经有了使自定义"工作单元"实现变得不必要的东西,那就是CurrentSessionContext类.如果我正确配置会话上下文,并在必要时进行清理,我很高兴.

所以,我想出了这个:

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

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

因此,通过所有这些设置,NHibernateHelper将始终能够返回有效的ISession,因此无需为"工作单元"实例化Repository实例以使其正常运行.相反,Repository是与工作的静态类ISessionNHibernateHelper.CurrentSession性能,并通过通用的方法,公开通过该功能.

所以,基本上,我最终得到了两个非常懒惰的单身人士.

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

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

另一个想法是,为了将依赖注入引入解决方案,就是创建一个名为的接口IDataProvider,并在第一次调用Repository该类时实例化该接口的一个实例.(但是,实现代码也应该能够关注上下文的概念.)

编辑2:
似乎很多人都喜欢我的想法,但在答案中对它的看法仍然太少.
我可以假设这是使用NHibernate的正确方法吗?:P

.net asp.net nhibernate orm repository-pattern

13
推荐指数
1
解决办法
1158
查看次数

如何微调FluentNHibernate的自动映射器?

好的,昨天我设法获得了NHibernate和FluentNHibernate的最新主干版本,以便与我最新的小项目一起工作.(我正在开发一个bug跟踪应用程序.)我使用Repository模式创建了一个很好的数据访问层.

我认为我的实体并不特别,而且随着ORM目前的成熟,我不想手工制作数据库.因此,我选择使用FluentNHibernate的自动映射功能,将NHibernate的"hbm2ddl.auto"属性设置为"create".

它真的像一个魅力.我将NHibernate配置放在我的app域的配置文件中,进行设置,并开始使用它.(暂时,我只创建了一些单元测试.)它创建了数据库中的所有表,以及我需要的所有表.它甚至正确地映射了我的多对多关系.

但是,有一些小故障:

  • DB中创建的所有列都允许为null.我知道它无法预测哪些属性应该允许null,哪些不应该,但至少我想告诉它它应该只允许null在.NET中有意义的那些类型(例如非-nullable值类型不应该允许null).
  • 它创建的所有nvarchar和varbinary列的默认长度都是255.我希望将它们放在max而不是它.

有没有办法告诉自动映射器上面的两个简单规则?

如果答案为否,如果我修改它创建的表,它会正常工作吗?(所以,如果我设置一些列不允许为null,并为其他一些更改允许的长度,它会正确地与它们一起工作吗?)

最终编辑:非常感谢所有匆匆离去并帮助过的人.我对Fluent的所有问题现在都解决了.

.net nhibernate orm nhibernate-mapping fluent-nhibernate

5
推荐指数
1
解决办法
2601
查看次数