经过一段时间的开发,我对ASP.NET程序编写常驻内存资源产生了疑问。
首先,从阅读各位大侠的博客或者书籍上看到,对于web开发,在许多地方会用到常驻内存的资源。
比如:
1、在结合Nhibenate的开发中,官方文档建议对ISessionFactory使用单例模式;
2、在领域驱动的开发中,许多人对资源库Repository建议常驻内存进行对领域对象的重载。那么我就有疑问了:web的交互通常都是在一次线程中,在页面生命周期完结后,所有其持有的资源都被释放了。
那么,常驻内存的资源应该放在程序的哪个部分呢?应该怎么访问呢?
最后,这样做有什么好处呢?
望各位不吝赐教。asp.netweb开发线程内存对象

解决方案 »

  1.   

    好处就是
    免得每次都创建和收回,如:有些对象,有些数据(如购物网站的分类,变化很少,不用每次都去数据库读吧)~它们都很少变化,每次创建都是一样的~
    那么就让它们常驻在内存上~放在什么位置~~~ 这个看架构~
    如果按三层的话
    我之前是在UI层, 但现在是在BLL层实现
      

  2.   

    ORM方面的
    Nhibenate 我就不知道,他应该有自己的机制~我是用EF, EF有个Find,这个函数会先查内存,如果内存没有再查数据库
    我想说的是每个ORM都有自己的策略~过了ORM  程序还可以实现要缓存那些数据,请看asp.net的缓存介绍 我现在使用的是System.Runtime.Caching 4.0的 自己搜搜看
    还有分布式缓存什么的上面的都是数据缓存,那么对象的,可以使用一些IOC 组件,我是用autofac,他们都很容易实现,并提供控制对象生命周期的函数或配置,
    不用IOC那就自己使用设计模式了~ 
      

  3.   

    我觉得,你说的 “我是用EF, EF有个Find,这个函数会先查内存,如果内存没有再查数据库
    我想说的是每个ORM都有自己的策略~”,和并不是常驻内存资源。一般ORM来讲,在服务器端,每一个request请求,都会有一个线程来处理,而这些用于查询的缓存是在这个线程中的,线程结束了,缓存就没有了。
      

  4.   

    那么请问,如何在Application_Start方法中创建一个对象,然后在全局访问这个对象呢?
      

  5.   

    在asp.net中有一个HttpRuntime.Cache对象,该对象是全局对象,可以换成全局数据。因此可以多用户共享。
      

  6.   

    static
    HttpRuntime.Cache
    Session
    Application