1

在我DefaultRegistry我有这样的配置:在StructureMap中,如何在运行时更改InstanceScope?

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?这应该如何实施? 另外,你认为这是一个获得长对话的好方法吗?或者有一种更好/更简单的方法来实现NHibernate的StructureMap &?

回答

1

看看Ayende的详细解释了如何使长时间运行的对话和的UnitOfWork:

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

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

+0

创建一个UnitOfWorkApplication类来处理UnitOfWork创建,并让StructureMap注入UnitOfWorkApplication实例而不是UnitOfWork实例解决了这个问题。非常感谢,你的解释正是我需要的。 – abutnaru 2009-05-24 16:55:10

0

这听起来有点奇怪,你正在尝试做什么。我想尝试的路线是

  • 在StructureMap中配置一个命名的实例,该实例也实现了上述接口,但其作用域有所不同。你可以为不同的接口消费者注入不同的依赖关系,这可能有帮助吗?
  • 编写自己的有效实现特定生命周期的CacheInterceptor。

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