简单的注入(inject)器文档对于 transient 和单例注册以及它们将如何被处置等都非常清楚。文档表明,当容器被处置时,除预构造对象之外的所有对象注册的单例都将被处置。
我的问题特别涉及单例注册,当 ASP.NET 应用程序被释放时,我需要释放它(当该服务被释放时,我发送任何剩余的消息)。我的大多数注册都是暂时的,并且在处理每个请求时都会被处理。在 VS/IISExpress 中调试时,我看不到我的单例何时被释放,或者容器本身何时最终被释放。在我的控制台应用程序和天蓝色服务中,完成后我只需调用container.Dispose()。 ASP.NET 中有任何关于最终清理的线索吗?
最佳答案
要释放单例,您需要在应用程序结束时显式调用Container.Dispose()
。例如,可以在 Global.asax 的 Application_End
事件中完成此操作。但请注意。
I send any remaining messages when that service is disposed
这似乎是一个非常糟糕的主意,因为 Application_End
事件不运行的原因有很多。 IIS 可以非常积极地终止应用程序,因此会导致断电和其他硬件故障。如果发生这种情况,则意味着您将丢失仍在本地缓冲区中的所有消息。
对于用于应用程序心跳和有时记录日志的 volatile 消息来说,这可能不是问题,但如果这些消息描述重要的业务事件,则应使用持久队列或存储机制。
When debugging in VS/IISExpress, I don't ever see when my singletons get disposed
很可能是这样。调试 Web 应用程序时,Web 应用程序永远不会自行停止。如果您停止调试,应用程序突然停止而没有机会运行任何终结器和清理方法,或者当您停止调试时,应用程序继续在后台运行;这仍然意味着您不会看到任何清理发生。
关于asp.net - 简单注入(inject)器 ASP.NET Singleton Dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965851/