Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在StructureMap中,如何在运行时更改InstanceScope?_C#_Dependency Injection_Inversion Of Control_Structuremap - Fatal编程技术网

C# 在StructureMap中,如何在运行时更改InstanceScope?

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,不幸的是,它仅适用于当前请求。当下一个请求到达时,初始配置再次激活,会话信息丢失 稍后,我还希望能够通过以下方

在我的DefaultRegistry中,我有以下配置:

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);