1

在我的 DefaultRegistry 我有这个配置:

ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext)
        .TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>();

在 Web 应用程序流程的某个时刻,我想将 InstanceScope 更改为 HttpSession 以获得长时间的对话,所以我这样做:

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpSession);

这似乎取代了最初的 InstanceScope,不幸的是它只持续当前请求。当下一个请求到达时,初始配置再次处于活动状态,会话信息丢失。

后来我还希望能够通过以下方式恢复更改:

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpContext);

但如果我让它在一个方向上工作,它可能会同时在两个方向上工作。

是否可以在运行时永久替换初始 InstanceScope?这应该如何实施?另外,您认为这是获得长时间对话的好方法,还是使用 StructureMap 和 NHibernate 有更好/更简单的方法?

4

2 回答 2

1

看看 Ayende 关于如何启用长时间对话和 UnitOfWork 的详细说明:

http://ayende.com/Wiki/Default.aspx?Page=HttpModules&AspxAutoDetectCookieSupport=1

我建议创建一个 UnitOfWorkApplication 模块,并让它负责创建一个 UnitOfWork 实例并将其添加到容器中,然后再执行代码(在处理请求之前,如示例中所示)。通过这种方式,您可以更灵活地控制工作单元的创建方式。

于 2009-05-24T14:17:27.160 回答
0

你想做什么对我来说听起来有点奇怪。我会尝试的路线是

  • 在 StructureMap 中配置一个命名实例,该实例也实现了所述接口,但范围不同。您可以为不同的接口使用者注入不同的依赖项,也许这有帮助?
  • 编写您自己的 CacheInterceptor 来有效地实现您的特定生命周期。

后者在例如 WCF 生命周期中完成:http: //blogs.rpionline.com/post/2009/02/How-to-use-NHibernate-and-StructureMap-in-a-WCF-application.aspx

于 2009-05-24T17:01:09.150 回答