我如何可以实现一个强大的会议每请求模式在我的项目,同时侧重于信息隐瞒什么?

StackOverflow https://stackoverflow.com/questions/2046168

我目前正在建立一个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 视和它能够.

你可以添加一个行动过滤器,可以管理它能够届会议&交易。(这是可以做到的行动或控制的水平。) 这里是一个例子:

http://weblogs.asp.net/srkirkland/archive/2009/09/03/asp-net-mvc-transaction-attribute-using-nhibernate.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top