zoukankan      html  css  js  c++  java
  • asp.net core ServiceProvider

     

    针对每次请求所使用的ServiceProvider依然是WebHost的ServiceProvider吗?

      对于某个由ServiceProvider提供的服务对象说,针对它的回收也是由这个ServiceProvider来完成的。

      具体来说,非根(root)ServiceProvider在自身被回收的时候,由它提供的采用Scoped和Transient模式的服务实例会自动被回收;至于采用Singleton模式的服务实例,针对它们的回收发生在根(root)ServiceProvider自身被回收的时候

     

     

    如果不是 ,那么两者是什么关系?

      如果我们在这个ServiceProvider上以Transient模式注册了一个服务,这意味着每次从ServiceProvider提取的都是一个全新的对象。如果这些对象引用着一些需要被回收的资源,我们希望资源的回收应该在每次请求处理结束之后自动执行。

      如果管道每次处理请求时所使用的都是同一个ServiceProvider对象,那么针对服务实例的回收只能在整个应用终止的时候才会发生(因为服务始终被这一个ServiceProvider所引用),这无疑会产生内存泄漏的问题。基于这个原因。

      管道总是会创建一个新的ServiceProvider来提供处理每个请求所需的服务,并且这个ServiceProvider将在每次请求处理完成之后被自动回收掉

      这样一个ServiceProvider被创建之后直接保存到当前的HTTP上下文中,我们可以利用HttpContext的RequestServices属性得到这个ServiceProvider

     

    总结就是:

      单例模式下,服务被根(root)ServiceProvider构建出来,并且由它回收

      Scoped和Transient模式下则是由每个单独的http请求中创建的新ServiceProvider构建与回收

      如果当前无法使用ASP.NET 需要开发一套新的框架,不论是传输协议是什么、不论解编码协议是什么,在IOC这一块都可以沿用ASP.NET CORE的处理逻辑,且开发成本很低,只需要在几个关键点引入ServiceProvider

  • 相关阅读:
    软件开发项目失败原因分析
    浅析ASP.NET三层架构(原创)
    ASP.NET中常用的26个优化性能方法
    软件设计原则
    垃圾回收(GC,Garbage Collection)机制
    值类型和引用类型的区别
    在OpenWrt中使用socket通信
    在windows下通过samba的共享编辑过的openwrt的样式文件无法访问的解决办法
    在OpenWrt中保存数据到config
    将openwrt的系统同步时间的显示修改为19700312 14:20的格式
  • 原文地址:https://www.cnblogs.com/Scissors/p/10810748.html
Copyright © 2011-2022 走看看