我正在试图了解如何设置StructureMap3配置,该配置在WebApi和控制台应用程序中都可以使用,例如:
For<ISession>().HybridHttpOrThreadLocalScoped().Use(p => p.GetInstance<TestingContainer>().GetSession());对于控制台应用程序,我希望对象的寿命与线程的寿命一样长,对于网站,我希望对象的生存期与http会话一样长。
对于MVC网站来说,这是可能的,因为HybridHttpOrThreadLocalScoped使用HttpSessionState来决定是创建新实例还是重用现有实例。
WebApi没有这个HttpSessionState,因此HybridHttpOrThreadLocalScoped不能工作。
如果我不关心控制台应用程序,那么我可能会用瞬态()或AlwaysUnique或类似的方法配置结构图。
因此,当没有HybridHttpOrThreadLocalScoped实例时,等同于HttpSessionState的是什么。
谢谢。
编辑
-to重新安排了问题..。
发布于 2015-10-26 09:02:54
通常,在生命周期管理方面,您应该更倾向于嵌套容器。这背后的原因正是您刚才提到的,在某些情况下,使用线程、HTTP或混合作用域都不起作用。我以前见过它引起了巨大的问题,人们认为DB连接是因为它们在其他环境中而被释放的,但在一个环境中却不是这样,而且,外露性也很好。
为此,请将每个请求要处理的依赖项设置为瞬态(默认),并在请求结束时释放嵌套容器。我在webapi 这里中写过这个工作流。此外,官方文件推荐这个努基特。
对于控制台应用程序,您需要这样做:
//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>();
}
}就这样,使用块为您处理所有的处理。
如果你还有其他问题,请问,我花了很多时间在这类事情上:)。
https://stackoverflow.com/questions/33233584
复制相似问题