我正在尝试在我的 WCF 应用程序中实现每请求会话模型,并且我已经阅读了无数关于此主题的文档,但似乎没有完整的演示。我实际上遇到了一些非常有用的文章,例如:
NHibernate 的 ISession,作用于单个 WCF 调用
但这些都是从过去 NHibernate 和 Ninject 没有 WCF 特定实现的时候开始的,因此他们通过实现他们的自定义服务提供程序等实现了我所需要的。由于 Ninject 和 NHibernate 现在都支持 WCF,我想保持一致通过使用他们的模块,但我最终来到了这里......
基本设置和流程应该是这样的:
- 在休眠配置中将 CurrentSessionContext 设置为 WcfOperationSessionContext
- 在服务启动、开始请求或初始化时间附近的任何地方,打开会话并将其绑定到当前上下文
- 存储库使用 SessionFactory.GetCurrentSession() 方法获取当前会话实例
- 在生命周期结束时解除绑定和关闭会话
我最初的问题是我无法访问 wcf 生命周期来处理我的绑定。在深入研究了ninject代码之后,我设法将我的方法与ServiceHost的Opening / Closing事件挂钩,而没有进行太多更改,但是由于它是线程静态的,所以我无法访问OperationContext。
后来我尝试启用 asp.net 兼容性并使用 Application_BeginRequest 和 Application_EndRequest,它看起来很有希望,但我认为这不是最好的解决方案,因为我应该将内容绑定到服务实例,而不是 http 请求。
有没有人使用 ninject 的内置 wcf 扩展库来实现这一点?或者关于我可能做错了什么的任何想法?