asp.net - 如何以及在何处根据请求在 winforms 中存储 nhibernate session

标签 asp.net nhibernate session-management

背景

我读过各种有关 nhibernate session 管理的博客和文档。我的问题是,winforms 和 webforms 都需要它。没错,我在 winforms (windows .exe) 和 webforms (asp.net web) 应用程序中使用相同的数据层。我读过一些关于 unit of work 的内容模式,对于 winform 来说是一个不错的选择。对于 Web 应用程序来说,将 nhibernate session 存储在 HttpRequest.Current.Items 中似乎是一个好方法。但如果是组合交易呢?我有 Web 应用程序、Windows 应用程序和 WCF 服务,它们都需要使用相同的 nhibernate 数据层。回到我的问题...

我计划使用此设计:NhibernateBestPractices在我的网络应用程序中,如下所示:

private ISession ThreadSession {
    get {
        if (IsInWebContext()) {
            return (ISession)HttpContext.Current.Items[SESSION_KEY];
        }
        else {
            return (ISession)CallContext.GetData(SESSION_KEY); 
        }
    }
    set {
        if (IsInWebContext()) {
            HttpContext.Current.Items[SESSION_KEY] = value;
        }
        else {
            CallContext.SetData(SESSION_KEY, value); // PROBLEM LINE HERE!!!
        }
    }
}

问题

我在 Windows 应用程序中使用此代码时遇到的问题是行

CallContext.SetData(SESSION_KEY, value);

如果我理解 CallContext() 正确的话,这将使 session 在我的 Windows 应用程序的整个生命周期中保持打开状态,因为它将 nhibernate session 存储为主应用程序线程的一部分。我听说过各种关于将休眠 session 保持打开时间过长的坏事,并且我知道根据设计,这并不意味着保持打开时间太长。如果我所有的假设都是正确的,那么上面这行代码就是不行。

鉴于这一切,我想将上面的行替换为会在 Windows 应用程序中更频繁地破坏 nhibernate session 的内容。类似于 HttpRequest 的生命周期。我不想让 Windows 客户端了解 nhibernate session (或事务)以及何时打开和关闭它。我希望它能够自动触发。

问题

那么,我可以在 Windows 应用程序中在哪里存储 nhibernate session ,该应用程序将允许我(即客户端之外的其他东西)根据每个数据库请求自动开始和结束事务(即,每当客户端进行调用时)到数据库)?

** 更新 **

这里还有 2 个关于如何实现工作单元模式的链接

http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

http://www.codeinsanity.com/2008/09/unit-of-work-pattern.html

最佳答案

您的每个应用程序都可以提供 IUnitOfWorkStorage 等接口(interface)的通用实现

public interface IUnitOfWorkStorage
{
    void StoreUnitOfWork(IUnitOfWork uow);
}

IUnitOfWork 可以是 ISession 的包装器,如下所示

public interface IUnitOfWork
{
   void Begin();
   void End();
}

Begin 可能会打开 session 并启动事务,而 End 将提交事务并关闭 session 。因此,您可以有 2 种 IUnitOfWorkStorage 实现,一种用于 Web 应用程序,一种用于 Windows 应用程序。 Web 应用程序可以使用 HttpContext.Current 或其他东西,并且您的 Windows 应用程序可以提供一个简单的对象存储,该对象存储在您的操作结束时进行处理,这将结束工作单元。

关于asp.net - 如何以及在何处根据请求在 winforms 中存储 nhibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834104/

相关文章:

c# - EF 6 不选择最近更新的值,除非我重建项目

c# - 列表模型 Razor View

asp.net - 如何在 ASP.NET 中将文本框的宽度设置为与 MaxLength 相同

sql - 对于返回多于 1 个值的 SQL 选择,当 Id 为 GUID 时,它们如何排序?

java - 关于浏览器 session 和 session ID 的一些问题/谜团?

java - 使用 Ehcache 的 WebApp session 管理

c# - 发布到 IIS 7.5 时出现 ASP.NET Core 404 错误

c# - NHibernate 根据分钟从日期字段中选择查询

c# - PostgreSQL - 选择不同 - 按字段排序未在选择中返回

Spring 3.1 MVC框架 session 管理