gpt4 book ai didi

wcf - NHibernate Session 在每个 wcf 服务方法调用时被释放

转载 作者:行者123 更新时间:2023-12-04 06:50:30 25 4
gpt4 key购买 nike

我在 Sharp Architecture 中使用 Wcf。我已经使用 WcfSessionStorage 等按照 Northwind 示例配置了我的项目。我在 wcf 服务中有一个使用 Repository<>.GetAll() 获取业务对象列表的方法。我正在使用 WcfTestClient 测试服务方法。第一次调用该方法时,一切正常。但是在随后的调用中,我在 Repository<>.GetAll() 方法上得到以下异常

[System.ObjectDisposedException]
Session is closed!
Object name: 'ISession'

似乎每次调用后都会处理 NHibernate session 。我通过使用以下属性装饰我的服务来解决这个问题
[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCall )]
public class WcfService : IWcfService
{
}

然而,这意味着,将在每次调用时创建一个服务实例,然后创建一个新的 nhibernate session 等。在我的场景中,不需要每次调用创建一个新的服务实例,我认为这是一个昂贵的过程,而不是正确的解决方案。我想知道我的场景中的最佳实践是什么,以及如何通过每次调用创建一个新的服务实例来使这件事起作用。

谢谢
纳比尔

最佳答案

最简单的方法是每次都创建一个新实例,这不是一个昂贵的过程,因为在 .NET 中创建一个新对象就像 0.00000000000000001 秒(我在 Ayande 的博客或其他地方读到过)。

我在我的项目中使用 Autofac DI,我通常将 ISession 作为容器范围(每个请求一个)。然后每个使用(直接或间接) ISession 的类都必须是容器范围或更低(工厂范围==每个类使用得到一个新实例)。如果使用 ISession 的类的范围更大( session 范围 == 单例),您将遇到当前遇到的问题。

如果您的服务是单例服务:
在第一次运行时创建服务,该服务使用 ISession,它应该是容器范围的,并且它是第一次运行。
对服务的下一个请求(现在已创建服务)仍然引用了已创建的 ISession(在上一个结束请求时已关闭),因此现在它已关闭。

我不建议使用您将打开/关闭的相同 ISession(在 NHibernate 文档中不推荐使用),只使用容器范围(我这样做,我没有任何性能问题),或者您应该手动创建 ISession在您的服务中的每种方法中,例如:

using(ISession s = ISessionFactory.OpenSession())
using(ITransaction t = .....)
....

但这一点都不好...

关于wcf - NHibernate Session 在每个 wcf 服务方法调用时被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3193251/

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