我如何可以实现一个强大的会议每请求模式在我的项目,同时侧重于信息隐瞒什么?
-
20-09-2019 - |
题
我目前正在建立一个ASP.NET 视项目,与它能够作为其坚持不懈层。
现在,一些功能已经实施,但只使用本地它能够会议:每一种方法,访问该数据库(阅读或写)需要为实例其自己的原则才能享受它的全部好处会议,与"使用()"条款。
问题是,我要杠杆,它能够很懒装载功能,以提高性能的我的项目。
这意味着开它能够每届会议的请求,直到查看是渲染。此外,同时请求必须得到支持(多的会议在同一时间)。
我如何可以实现,作为干净的可能吗?
我搜索的网点和了解到该会议每请求模式。大多数实现我看到了使用某种Http*(HttpContext,等等。) 对象存储的会议。此外,使用Application_BeginRequest/Application_EndRequest职能是复杂的,因为他们被解雇的每个HTTP请求(aspx文件,css文件,js文件,等等), 当我唯一想到的实例一届会议的每一次请求。
担心我有的是,我不要我的意见或控制器具有访问它能够会议(或者更一般地说,它能够命名空间和代码)。这意味着,我不想把手会议在控制水平,也不看一个。
我有几个选项中心。其中一个似乎是最好的吗?
- 使用拦截器(如在技术发展的看法),得到触发之前和之后控制行动。这些会打开和关闭的会议/交易。这是可能的ASP.NET 视的世界?
- 使用CurrentSessionContext单独提供它能够在网上下文。使用 这页 作为一个例子,我认为这是相当有希望的,但是,仍然需要过滤器的水平。
- 使用HttpContext.电流。项储存的要求会议。这个,加上一些代码行在全球性的。asax.cs,可以方便地提供给我一届会议上请求的水平。然而,这意味着,依赖性将会之间注入它能够和我的意见(HttpContext).
非常感谢你!
解决方案
好了伙计们,之后几天的工作,我最后决定使用HttpContext.电流。项目载的会议。
它的伟大工程!
这里我是怎么做到的
import System.Web
class SessionManager {
public static ISession GetSession()
var session = HttpContext.Current.Items["NHibernateSession"];
if (session == null) {
session = ...; // Create session, like SessionFactory.createSession()...
HttpContext.Current.Items.Add("NHibernateSession", session);
}
return session;
}
public static void CloseSession()
{
var session = HttpContext.Current.Items["NHibernateSession"];
if (session != null) {
if (session.IsOpen) {
session.close();
}
HttpContext.Current.Items.Remove("NHibernateSession");
}
}
}
通过使用静态的方法提供这类、一个可以获得一届会议(例如,在一个控制器),这是联系在一起的目前的HttpContext(目前的网请求)。我们需要一段代码叫CloseSession()方法的请求时完成。
在全球性的。asax.cs:
protected void Application_EndRequest(object sender, EventArgs args)
{
NHibernateSessionManager.CloseSession();
}
该Application_EndRequest事件的自动调当届会议完成,使本届会议可以适当地关闭一个设置的。这是有用的,因为否则我们将不得不这样做,在每一个控制器!
其他提示
使用DI及际奥委会。最IoC来与每一个申请实例的行为。
我的"解决方案"涉及使用统一的注射每届会议的请求,在控制器:
http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html
看看 S#arp建筑.这是一个非常漂亮的结构ASP.NET 视和它能够.
你可以添加一个行动过滤器,可以管理它能够届会议&交易。(这是可以做到的行动或控制的水平。) 这里是一个例子: