C# IHTTP模块和控制台应用程序的流畅NHibernate模式

C# IHTTP模块和控制台应用程序的流畅NHibernate模式,c#,asp.net-mvc,design-patterns,fluent-nhibernate,C#,Asp.net Mvc,Design Patterns,Fluent Nhibernate,我目前有一个C#MVC 2 web应用程序,在存储库模式中使用Fluent NHibernate(+LINQ),并使用Ninject处理MVC控制器的构造函数要求,即在存储库中传递它 我的Fluent NHibernate代码目前已连接到IHttpModule中,因此可以通过web请求打开和关闭会话 在我尝试将我的域模型连接到控制台应用程序之前,这是非常有效的 首先,我决定将数据库逻辑移到域模型中。我猜这是不好的行为,但我在这里寻求代码设计方面的帮助,所以请随时提出建议。我之所以想这样做,是因为

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

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

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

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

回到问题上来。。。我遇到了一个问题,NHibernate的GetCurrentSession()似乎假设您正在使用web—它崩溃了,我得到了一个关于WebSession的NH代码的回溯

为了便于参考,代码如下:


我为没有说得太具体而道歉;我正在寻找代码设计建议,以便在存储库模式中最好地处理FNH+Linq,该存储库模式可以很好地与Web和控制台应用程序配合使用——并分别询问我的数据库连接(即NH逻辑)是否应该在域项目中。

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

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

public class PeopleRepository {
    public PeopleRepository(ISession session) {
        // store session
    }
}
在我的例子中,我将使用IoC容器注入会话依赖项。我可以从任何类型的应用程序中使用此容器,无论是使用每请求会话模式的基于web的应用程序还是控制台应用程序

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


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

我经常使用session对象来表示我要处理某个东西(它不是一个工作单元实现,因为我在某一点之前不会保存所有工作)

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

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

这是一种很好的抽象方法,可以在不使用硬依赖项的情况下获得对数据库连接或任何东西的支持

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