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

本文关键字:Fluent NHibernate 模式 应用程序 控制台 IHttpModule | 更新日期: 2023-09-27 17:58:39

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

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

在我尝试将我的域模型挂接到控制台应用程序之前,这非常有效。

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

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

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

我很抱歉没有说得太具体;我正在寻找代码设计建议,以在一个与Web和控制台应用程序都能很好地工作的存储库模式中最好地处理FNH+Linq,并单独询问我的数据库连接(即NH逻辑)是否应该在域项目中。

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

这是个好问题。有很多不同的方法可以回答这个问题,但每个答案都取决于你对不同方法的经验。例如,您熟悉TDD吗?依赖项注入?IoC集装箱?等等。

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

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

在我的情况下,我将使用IoC容器来注入会话依赖关系。我可以从任何类型的应用程序中使用这个容器,无论是使用每请求会话模式的基于web的应用程序还是控制台应用程序。

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

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

我经常使用会话对象来指示我要处理某个东西(这不是工作单元实现,因为我不会保存所有工作直到某个点)

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

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

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

这是一种很好的抽象方式,可以在不使用硬依赖项

的情况下获得对数据库连接或其他内容的支持