简单注入器ASP.NET单例处理

简单注入器ASP.NET单例处理,asp.net,singleton,dispose,simple-injector,Asp.net,Singleton,Dispose,Simple Injector,Simple Injector文档非常清楚瞬态和单例注册,以及如何处理它们等。文档表明,当容器被处理时,除了预构造对象之外,所有已注册的单例都将被处理 我的问题特别涉及一个单例注册,当ASP.NET应用程序被释放时,我需要释放该注册(当该服务被释放时,我发送任何剩余的消息)。我的大多数注册都是暂时的,当每个请求都被处理时就会被处理掉。在VS/IISExpress中进行调试时,我从来没有看到我的单例何时被释放,或者容器本身何时最终被释放。在我的控制台应用程序和azure服务中,我只需在完成后调用c

Simple Injector文档非常清楚瞬态和单例注册,以及如何处理它们等。文档表明,当容器被处理时,除了预构造对象之外,所有已注册的单例都将被处理


我的问题特别涉及一个单例注册,当ASP.NET应用程序被释放时,我需要释放该注册(当该服务被释放时,我发送任何剩余的消息)。我的大多数注册都是暂时的,当每个请求都被处理时就会被处理掉。在VS/IISExpress中进行调试时,我从来没有看到我的单例何时被释放,或者容器本身何时最终被释放。在我的控制台应用程序和azure服务中,我只需在完成后调用container.Dispose()。在ASP.NET中有关于这次最终清理的线索吗

对于要处理的单例,您需要在应用程序结束时显式调用
Container.Dispose()
。例如,可以在Global.asax中的
应用程序\u End
事件中执行此操作。但请注意

当该服务被释放时,我发送任何剩余的消息

这似乎是一个非常糟糕的主意,因为有很多原因导致
应用程序端
事件无法运行。IIS可以非常积极地杀死应用程序,断电和其他硬件故障也会如此。如果发生这种情况,则意味着您将丢失仍在本地缓冲区中的所有消息

对于用于应用程序心跳和日志记录的易失性消息来说,这可能不是问题,但如果这些消息描述了重要的业务事件,则应该使用持久的队列或存储机制

在VS/IISExpress中调试时,我看不到我的单身汉何时会被处置


很可能是这样。调试web应用程序时,web应用程序从不自行停止。如果您停止调试,或者应用程序突然停止而没有机会运行任何终结器和清理方法,或者当您停止调试时,应用程序在后台继续运行;这仍然意味着你不会看到任何清理工作发生。

我完全同意你对这种方法存在的问题的看法,但在大多数情况下,这总比什么都不做要好(即扔掉任何未发送的消息)。请记住,即使使用冗余方法,也不是故障保护。我要问的是,在托管的IIS ASP.NET环境中,如何正确地确保释放SimpleInjector容器,以便我至少有机会尝试发送任何本地排队的MSG。OWIN ONAPPPDisposing是否等同于应用程序_End?如果丢失消息是一个问题,我建议您更改设计。将这些消息保存在与其余请求运行相同的数据库事务中。这是一种非常常见的防止消息丢失的方法。关于奥文:我不知道奥纳普做了什么。您必须阅读文档并进行测试。我将再看一看数据事务中的特定消息传递是如何完成的。IIRC,将消息写入Azure ServiceBus(我们使用的)必须在ambient DB事务范围之外完成,这与本文的目的背道而驰。看见谢谢讨论,史蒂文!请看一看NServiceBus支持的。它允许将消息存储在本地“事务”队列中,并在确定这样做是安全的之后将其发送到真正的基础设施。