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逻辑)是否应该在域项目中。
这是个好问题。有很多不同的方法可以回答这个问题,但每个答案都取决于你对不同方法的经验。例如,您熟悉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
}
这是因为即使是控制台应用程序也有一个可以启动会话的起点(例如,当用户在控制台中编写命令时)。
会话工厂有一个SessionCreated
和SessionDestroyed
事件,它们可以被任何东西钩住,在我们的例子中是一个nhibernate会话工厂。
这是一种很好的抽象方式,可以在不使用硬依赖项