C# 在StructureMap中,如何在运行时更改InstanceScope?
在我的DefaultRegistry中,我有以下配置:C# 在StructureMap中,如何在运行时更改InstanceScope?,c#,dependency-injection,inversion-of-control,structuremap,C#,Dependency Injection,Inversion Of Control,Structuremap,在我的DefaultRegistry中,我有以下配置: ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext) .TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>(); 这似乎取代了初始InstanceScope,不幸的是,它仅适用于当前请求。当下一个请求到达时,初始配置再次激活,会话信息丢失 稍后,我还希望能够通过以下方
ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext)
.TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>();
这似乎取代了初始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有更好/更简单的方法?请看Ayende关于如何启用长时间对话和UnitOfWork的详细说明:
我建议创建一个UnitOfWorkApplication模块,让它负责创建一个UnitOfWork实例,并在代码执行之前(在处理请求之前,如示例中所示)将其添加到容器中。这样,您就可以更灵活地控制工作单元的创建方式。看看Ayende关于如何启用长时间运行的对话和工作单元的详细说明:
我建议创建一个UnitOfWorkApplication模块,让它负责创建一个UnitOfWork实例,并在代码执行之前(在处理请求之前,如示例中所示)将其添加到容器中。通过这种方式,您可以更灵活地控制工作单元的创建方式。您试图做的事情听起来有点奇怪。我会尝试的路线是
- 在StructureMap中配置一个命名实例,该实例也实现了上述接口,但作用域不同。您可以为不同的接口使用者注入不同的依赖项,这可能会有所帮助吗
- 编写自己的CacheInterceptor,有效地实现特定的生命周期
后者已经完成了,例如,在这里针对WCF生命周期:我觉得您试图做的事情有点奇怪。我会尝试的路线是
- 在StructureMap中配置一个命名实例,该实例也实现了上述接口,但作用域不同。您可以为不同的接口使用者注入不同的依赖项,这可能会有所帮助吗
- 编写自己的CacheInterceptor,有效地实现特定的生命周期
后者在这里完成,例如,对于WCF生命周期:创建UnitOfWorkApplication类来处理UnitOfWork创建,并让StructureMap注入UnitOfWorkApplication实例而不是UnitOfWork实例,解决了问题。非常感谢,您的解释正是我所需要的。创建UnitOfWorkApplication类来处理UnitOfWork创建并让StructureMap注入UnitOfWorkApplication实例而不是UnitOfWork实例解决了问题。非常感谢,你的解释正是我需要的。
PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpContext);