gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:04:51 29 4
gpt4 key购买 nike

背景

我读过各种有关 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com