StructureMap3 HybridHttpOrThreadLocalScoped没有HttpSessionState

时间:2015-10-20 09:58:58

标签: asp.net-web-api lifecycle structuremap3

我试图弄清楚如何设置StructureMap3配置,它在WebApi和控制台应用程序中都有效,例如:

For<ISession>().HybridHttpOrThreadLocalScoped().Use(p => p.GetInstance<TestingContainer>().GetSession());

对于控制台应用程序,我希望只要该主题存在,该对象就可以存在,只要http会话存在,我希望网站能够存在。

这可以通过MVC网站实现,因为HybridHttpOrThreadLocalScoped使用HttpSessionState来确定是创建新实例还是重用现有实例。

WebApi没有此HttpSessionState,因此HybridHttpOrThreadLocalScoped将无效。

如果我不关心控制台应用程序,那么我可能会使用Transient()或AlwaysUnique或类似的方式配置structuremap。

因此,当没有HttpSessionState实例时,HybridHttpOrThreadLocalScoped的等价物是什么。

谢谢。

修改

- 重新安排问题...

1 个答案:

答案 0 :(得分:0)

通常,您应该支持Nested Containers进行生命周期管理。这背后的原因正是您刚刚提到的,在某些情况下,使用Thread,HTTP或hybrid scoped根本不起作用。我已经看到它导致了巨大的问题,因为人们认为数据库连接正在被处置,因为它们在其他环境中,但在一个环境中它们不是。而且,显性很好。

要执行此操作,请将每个请求处理的依赖项设置为Transient(默认值),并在请求结束时处置嵌套容器。我在webapi here中写过这个工作流程。此外,official docs推荐this nuget

对于控制台应用,您需要执行以下操作:

//parent Container set up at app start
public void On_UserAction()
{
    //global container set up at app start, either use ObjectFactory (bad, deprecated and to be removed) or just keep track of it yourself.
    using(var nestedContainer = GlobalContainer.GetNestedContainer())
    {
        var dependency = nestedContainer.GetInstance<DependencyThatHandlesUserInput>();
    }
}

就是这样,使用块处理所有处理。

如果您有任何其他问题,请问,我花了很多时间在这类事情上:)。