IHttpModule和控制台应用程序的流畅NHibernate模式

我目前在存储库模式中使用Fluent NHibernate(+ LINQ)的C#MVC 2 Web应用程序,并使用Ninject来处理MVC控制器在存储库中传递的构造函数要求。

我的Fluent NHibernate代码目前已连接到IHttpModule,因此可以使用Web请求打开和关闭会话。

这很有效,直到我尝试将我的域模型挂钩到控制台应用程序。

首先,我决定将我的数据库逻辑移动到我的域模型中。 我猜这是不好的行为,但我在这里寻求代码设计方面的帮助,所以请随时提出建议。 我想这样做是因为我想在这个域模型上编写一个控制台app + web app,而不关心数据的存储位置和方式。 也许我应该有一个单独的“基础设施”项目,它使用域模型来执行特定的实现?

回到问题…我遇到了一个问题,似乎Fluent NHibernate的GetCurrentSession()假设你正在使用网络 – 它崩溃了,我得到一些提到WebSession的NH代码的追溯。

为了便于参考,代码如下: https : //github.com/cthielen/RightsManagement 。

我为不太具体而道歉; 我正在寻找代码设计建议,以最好地处理FNH + Linq的存储库模式,该模式适用于Web和控制台应用程序 – 并单独询问我的数据库连接(即NH逻辑)是否应该在域项目中或不。

这是一个很好的问题。 有很多不同的方法可以解决这个问题,但每个答案都取决于你对不同方法的经验。 例如,您熟悉TDD吗? dependency injection? IoC容器? 等等。

我现在可以给出的最好的建议是清理所有现有的类,以便它们不依赖于上下文。 这方面的一个例子是修改您的存储库类,以便它们将ISession对象作为构造函数参数,而不是依赖于看起来是单独的实例,只有当您在HTTP上下文中时才存在。 这将允许您将会话创建逻辑重构为域逻辑之外的更高级别。

public class PeopleRepository { public PeopleRepository(ISession session) { // store session } } 

在我的例子中,我将使用IoC容器来注入会话依赖项。 我可以在任何类型的应用程序中使用此容器,无论它是使用每个请求会话模式的基于Web的应用程序还是控制台应用程序。

你需要做一些工作才能让NHibernate在这两个应用程序中都能发挥出色。 挑战是尽可能减少这项工作。

我很乐意提供更多指导。 让我知道。

我经常使用会话对象来表明我将要处理某些事情(这不是一个工作单元实现,因为我直到某一点才保存所有工作)

 using (var session = SessionFactory.Create()) { // do all work here } 

这是有效的,因为即使控制台应用程序也有一个可以启动会话的起点(例如,当用户在控制台中编写了一个命令时)。

会话工厂有一个SessionCreated和一个SessionDestroyed事件,它可以被任何东西挂钩,在我们的例子中是一个nhibernate会话工厂。

这是一种很好的抽象方式来获得对数据库连接的支持,或者不使用硬依赖的任何东西