asp.net - 简单注入(inject)器 ASP.NET Singleton Dispose

标签 asp.net singleton dispose simple-injector

简单的注入(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/

相关文章:

c# - System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe 和 LowerCodeCharts.None 中的错误?

c# - ADO.NET 连接字符串错误

javascript - 如何在 JavaScript 中验证当前日期的一个日期?

scala - 推荐代码风格 : case object Foo or object Foo extends Serializable?

asp.net - 在 Web 应用程序之间传递 ID

Angular 7 服务不充当单例

c# - Singleton的无状态实例方法线程安全(C#)

c# - 如果我在 using 语句结束之前返回会怎样?会调用 dispose 吗?

c# - 如何使用反射对 Dispose() 进行单元测试?

c# - 在这种情况下, "not disposing StreamWriter"是否可能导致内存泄漏?