【分享】开源或免费的ASP.NET web应用列表

链接目录 Link Directories

  1. *(ASPLD) ASP.NET 3.5 Link Directory –
    http://www.n3o.co.uk/software/aspld.aspx
  2. XD Link Directory –
    http://www.ex-designz.net/softwaredetail.asp?fid=835
  3. ASP.NET 2.0 Link Directory –
    http://www.davemackey.net/Applications/LinkDirectory/tabid/88/Default.aspx

在PetShop
4.0的命名空间PetShop.ICacheDependency中,定义了名为IPetShopCacheDependency接口,它仅包括了一个接口方法:
public interface IPetShopCacheDependency
{      
    AggregateCacheDependency GetDependency();
}

网站/Email系统 Web / E Mail

  1. DotNet Open Mail – http://dotnetopenmail.sourceforge.net/
  2. qqMail – http://www.umailcampaign.com/mailcom.aspx
  3. Sharp Web Mail – http://anmar.eu.org/projects/sharpwebmail/

            // Store the output in the data cache, and Add the necessary
AggregateCacheDependency object
            HttpRuntime.Cache.Add(key, data, cd,
DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration,
CacheItemPriority.High, null);
        }
        return data;
    }
}

客户关系管理体系Customer Relationship Management (CRubiconM)

  1. Splendid CRM – http://www.splendidcrm.com/

GetCategoryName()方法首先会检查缓存中是不是已经存在CategoryName数据项,假如已经存在,就经过缓存直接获取数据;否则将经过工作逻辑层调用数据访问层访问数据库得到CategoryName,在取得了CategoryName后,会将新得到的数据及其DependencyFacade类创造的AggregateCacheDependency对象添加到缓存中。

电子商务/在线购物网站 e-Commerce / Online Shopping Carts

  1. Dash Commerce – http://dashcommerce.org/
  2. Dot Shopping Cart – http://www.dotshoppingcart.com/
  3. VevoCart – http://www.vevocart.com/
  4. e-Shop ASP.NET – http://fkn1337.com/e-shop-aspnet-mysql-script/
  5. PressTopia Shop – http://presstopia.com/dnn/Default.aspx?tabid=236
DisableNotifications 为特定数据库禁用 SqlCacheDependency对象更改通知
DisableTableForNotifications 为数据库中的特定表禁用SqlCacheDependency对象更改通知
EnableNotifications 为特定数据库启用SqlCacheDependency对象更改通知
EnableTableForNotifications 为数据库中的特定表启用SqlCacheDependency对象更改通知
GetTablesEnabledForNotifications 返回启用了SqlCacheDependency对象更改通知的所有表的列表

Classifieds

  1. Classifieds Starter Kit –
    http://msdn.microsoft.com/en-us/cc533489.aspx
  2. Dating .NET – http://www20.brinkster.com/joemay7/

引入Proxy格局,完结了在缓存级别上对事情对象的包裹,增强了对工作对象的支配。由于暴光在对象外的办法是一致的,因此对于调用方而言,调用代理对象与忠实对象并没有精神的界别。

Wiki系统 Wiki’s

  1. FlexWiki – http://www.flexwiki.com/
  2. *ScrewTurn Wiki –
    http://www.screwturn.eu/Default.aspx?Page=Wiki&AspxAutoDetectCookieSupport=1 

电子商务 1
图4-2 AspNet_SqlCacheTablesForChangeNotification数据表

下边是开源或免费的ASP.NET web应用列表 ,包蕴了电子商务,论坛,博客系统,Email系统等各样方面,尽管急需用ASP.NET架设web应用可以设想它们。倘使你还知道其余开源ASP.NET web应用,请留言。电子商务 2


4.3.2  CacheDependency实现

选聘和求职系统 Recruitment / Job Systems

  1. Job Site Starter Kit –
    http://www.binaryintellect.net/articles/a203c824-aec1-41b7-b3ec-49a15d5c9ebb.aspx
  2. Stock / Inventory Tracker –
    http://itracker.df-software.com/download.aspx

应用缓存的建制对品质的升官分外强烈。通过ACT(Application Center
Test)的测试,可以窥见安装缓存后实施的质量比未设置缓存时的性质足足增强三倍多。

内容管理种类 Content Management Systems

  1. *Umbraco – http://umbraco.org/
  2. *DotNetNuke – http://www.dotnetnuke.com/
  3. The Beer House –
    http://www.codeplex.com/Wiki/View.aspx?ProjectName=TheBeerHouse
  4. My Web Pages Starter Kit –
    http://www.codeplex.com/MyWebPagesStarterKit/ 
  5. Basic CMS – http://www.basic-cms.com/
  6. 电子商务,JMD CMS – http://www.codeplex.com/JMDCMS/
  7. Nickel & Dime CMS – http://ndcms-net.sourceforge.net/
  8. Nolior EZNews – http://sourceforge.net/projects/nolioreznews/

与ASP.NET 1.x的页输出缓存不一致的是,在ASP.NET
2.0中,为ASP.NET用户控件新引入了CachePolicy属性,该属性的类型为ControlCachePolicy类,它以编程情势落成了对ASP.NET用户控件的出口缓存设置。大家得以由此安装ControlCachePolicy类的Dependency属性,来安装与该用户控件相关的借助项,例如在ProductsControl用户控件中,举办如下的设置:
protected void Page_Load(object sender, EventArgs e)
{
    this.CachePolicy.Dependency =
DependencyFacade.GetProductDependency();
}

Misc

  1. ASP.NET Small Business Web Site Starter Kit –
    http://msdn.microsoft.com/en-us/cc533514.aspx
  2. ASP.NET Personal Web Site Starter Kit –
    http://msdn.microsoft.com/en-us/cc533486.aspx
  3. Time Tracking Website –
    http://msdn.microsoft.com/en-us/cc533488.aspx
  4. DinnerNow (Food Ordering System) – http://www.dinnernow.net/

体现页面title的逻辑是置身Page_Load事件措施中,由此每趟打开该页面都要执行获取CategoryName的不二法门。假诺没有利用缓存机制,当Category数据较多时,页面的展示就会万分缓慢。

论坛/门户/网络系统 Forum / Portals / Networks

  1. *Kigg (Digg like application) – http://www.codeplex.com/Kigg
  2. Club Starter Kit – http://www.codeplex.com/ClubStarterKit/
  3. Drop Things (Web 2.0 Portal) – http://www.dropthings.com/
  4. Yet Another Forum – http://www.yetanotherforum.net/
  5. DMG Forum – http://www.dmgforums.com/

一经没有超越Duration设置的为期值,当用户访问同一的页面或控件时,就足以一向在缓存中赢得。
接纳VaryByParam参数可以依照设置的参数值建立不一样的缓存。例如在一个输出天气预先报告结果的页面中,如若急需为一个ID为txtCity的TextBox控件建立缓存,其值将体现某城市的空气温度,那么大家得以拓展如下的安装:
<%@ OutputCache Duration=”60” VaryByParam=”txtCity” %>

博客系统 Blogs / Blogging

  1. *Blog Engine .NET – http://www.dotnetblogengine.net/
  2. DasBlog – http://www.dasblog.info/
  3. *Sub Text – http://www.subtextproject.com/
  4. PressTopia – http://presstopia.com/dnn/Default.aspx?tabid=160 

        // Check if the data exists in the data cache
        if (data == null)
        {
            data = product.GetProductsByCategory(category);

图片和视频收藏连串 Image & Video Galleries

  1. Media Library Starter Kit –
    http://www.asp.net/downloads/starter-kits/media-library/
  2. ASP.NET Foto Gallery –
    http://www.pentabyte.de/software/WebControls/
  3. gPhotoNet – http://www.thezeal.com/software/index.php?gPhotoNet

以地点的吩咐为例,表达将对名为MSPetShop4的数据库拔取SqlCacheDependency成效,且SQL
Server选取了windows集成验证办法。我们还足以对有关的数据表执行aspnet_regsql命令,如:
aspnet_regsql -S localhost -E -d MSPetShop4 -t Item -et
aspnet_regsql -S localhost -E -d MSPetShop4 -t Product -et
aspnet_regsql -S localhost -E -d MSPetShop4 -t Category -et

     // 检查缓存中是或不是存在该数量项;
     string data = (string)HttpRuntime.Cache[cacheKey];
     if (data == null)
     {
           // 通过web.config的布置获取duration值;
           int cacheDuration =
int.Parse(ConfigurationManager.AppSettings[“CategoryCacheDuration”]);
           //
若是缓存中不设有该多少项,则经过作业逻辑层访问数据库获取;
           data = category.GetCategory(categoryId).Name;
           // 通过Facade类创建AggregateCacheDependency对象;
           AggregateCacheDependency cd =
DependencyFacade.GetCategoryDependency();
           // 将数据项以及AggregateCacheDependency 对象存储到缓存中;
           HttpRuntime.Cache.Add(cacheKey, data, cd,
DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration,
CacheItemPriority.High, null);
      }
      return data;
}

假如对微型电脑硬件系统有充裕的询问,那么大家对于Cache那个名词一定是熟谙的。在CPU以及主板的芯片中,都引入了那种名为高速缓冲存储器(Cache)的技巧。因为Cache的存取速度比内存快,因此引入Cache可以使得的化解CPU与内存之间的快慢不般配难题。硬件系统能够使用Cache存储CPU访问可能率高的这一个数据,当CPU要求拜访那几个数量时,可以直接从Cache中读取,而无需访问存取速度相对较慢的内存,从而升高了CPU的工作功能。软件设计借鉴了硬件设计中引入缓存的建制以革新整个连串的性子,尤其是对于一个数据库驱动的Web应用程序而言,缓存的选取是必备的,终归,数据库查询大概是全部Web站点中调用最频仍但同时又是推行最缓慢的操作之一,大家不只怕被它老迈的双腿拖缓大家前进的道路。缓存机制正是消除这一瑕疵的加快器。

productsList对象属于自定义的CustomList类型,那是一个派生自System.Web.UI.WebControls.DataList控件的类,它的DataSource属性可以接受IList集合对象。
但是在PetShop
4.0的安插中,对于类似于ProductsControl类型的控件而言,选择的缓存机制是页输出缓存。大家可以从ProductsControl.ascx页面的Source代码中窥见线索:
<%@ OutputCache Duration=”100000″ VaryByParam=”page;categoryId” %>

假诺急需自定义CacheDependency,那么创设看重项的章程又有两样。但是不管是成立SqlCacheDependency对象,依然自定义的CacheDependency对象,都是将这个看重项添加到AggregateCacheDependency类中,由此大家也得以为自定义CacheDependency建立专门的类,只要达成IPetShopCacheDependency接口即可。

电子商务 3
图4-4 Facade模式

放入在缓存中的数据对象其生命周期是境遇限制的,固然在全方位应用程序的生命周期里,也不可能确保该多少对象一贯有效。ASP.NET可以对应用程序缓存举行田间管理,例如当数码项无效、过期或内存不足时移除它们。其它,调用者还是能经过CacheItemRemovedCallback委托,定义回调方法使得数据项被移除时可以布告用户。

其中,AspNet_SqlCacheUpdateChangeIdStoredProcedure即是工具添加的一组存储进度中的一个。当对Product数据表执行Insert、Update或Delete等操作时,就会激活触发器,然后实施AspNet_SqlCacheUpdateChangeIdStoredProcedure存储进程。其举行的经过就是修改AspNet_SqlCacheTablesForChangeNotification数据表的changeId字段值:
CREATE PROCEDURE dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure
             @tableName NVARCHAR(450)
         AS
         BEGIN
             UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH
(ROWLOCK) SET changeId = changeId + 1
             WHERE tableName = @tableName
         END  
GO

.Net 2.0引入的自定义缓存器重项,特别是依照MS-SQL
Server的SqlCacheDependency性情,使得大家得以幸免“数据过期”的难题,它可以基于数据库中相应数据的成形,文告缓存,并移除这一个过期的数码。事实上,在PetShop
4.0中,就丰裕地采取了SqlCacheDependency天性。

应用程序缓存其落实原理说来平淡无奇,仅仅是经过ASP.NET管理内存中的缓存空间。放入缓存中的应用程序数据对象,以键/值对的措施存储,那有利于用户在拜访缓存中的数据项时,可以遵照key值判断该项是或不是存在缓存中。

电子商务 4
 图4-3 CacheDependency工厂

四 PetShop之ASP.NET缓存

电子商务 5
图4-1 aspnet_regsql工具

在PetShop
4.0的规划中,是通过引入Facade格局以福利调用者越发简明地得到AggregateCacheDependency类型对象。

     string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId);

            // Create a AggregateCacheDependency object from the
factory
            AggregateCacheDependency cd =
DependencyFacade.GetProductDependency();

虽说DependencyAccess类创立了落到实处了IPetShopCacheDependency接口的类Category、Product、Item,然则我们所以引入IPetShopCacheDependency接口,其目的就在于获取创造了借助项的AggregateCacheDependency类型的靶子。大家可以调用对象的接口方法GetDependency(),如下所示:
AggregateCacheDependency dependency =
DependencyAccess.CreateCategoryDependency().GetDependency();

只是这么的做法干扰了作为工厂类的DependencyAccess的自个儿职务,且创立IPetShopCacheDependency接口对象的表现仍旧有恐怕被调用者调用,所以保留原来的DependencyAccess类依然是有须求的。

4.2 SqlCacheDependency特性

Facade情势的目的决不要引入一个新的法力,而是在存活作用的底子上提供一个更高层次的虚幻,使得调用者可以直接调用,而不用关爱内部的兑现情势。以CacheDependency工厂为例,大家须求为调用者提供得到AggregateCacheDependency对象的省事方法,由此创立了DependencyFacade类:
public static class DependencyFacade
{
    private static readonly string path =
ConfigurationManager.AppSettings[“CacheDependencyAssembly”];
    public static AggregateCacheDependency GetCategoryDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return
DependencyAccess.CreateCategoryDependency().GetDependency();
        else
            return null;
    }
    public static AggregateCacheDependency GetProductDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return
DependencyAccess.CreateProductDependency().GetDependency();
        else
            return null;
        }
    public static AggregateCacheDependency GetItemDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return
DependencyAccess.CreateItemDependency().GetDependency();
        else
            return null;
    }
}

以下是该工具的授命参数表明:
-?  突显该工具的支持意义;
-S  后接的参数为数据库服务器的称谓或许IP地址;
-U  后接的参数为数据库的登陆用户名;
-P  后接的参数为数据库的登陆密码;
-E  当使用windows集成验证时,使用该功能;
-d  后接参数为对哪一个数据库选拔SqlCacheDependency功效;
-t  后接参数为对哪一个表采纳SqlCacheDependency作用;
-ed  允许对数据库使用SqlCacheDependency效能;
-dd  禁止对数据库采纳SqlCacheDependency功用;
-et  允许对数据表采纳SqlCacheDependency成效;
-dt  禁止对数据表选用SqlCacheDependency成效;
-lt  列出如今数据库中有何样表已经选择sqlcachedependency功能。

这就是说大家是还是不是应该为了追求高质量,而不顾所谓“数据过期”所带来的隐患呢?显明,在接近于股票系统那种多少更新往往的一定情景下,数据过期的不好表现甚至比低效的性质更令人难以承受。故而,大家需求在性质与数码正确性间作出权衡。所幸的是,.Net
Framework
2.0引入了一种新的缓存机制,它为我们的“鱼与熊掌兼得”带来了技术上的方向。

为数量表Product启用SqlCacheDependency对象更改公告的落实则为:
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionStr,
“Product”);

工作逻辑层BLL中与Product、Category、Item有关的事务方法,其促成逻辑是调用数据访问层(DAL)对象访问数据库,以获取有关数据。为了精雕细刻系统性子,大家就须要为那么些完毕情势增添缓存机制的逻辑。当大家操作增添了缓存机制的作业对象时,对于调用者而言,应与BLL业务对象的调用保持一致。也即是说,大家要求引入一个新的靶子去决定原来的BLL业务对象,这些新的对象就是Proxy形式中的代理对象。

引入缓存看来是做实质量的“完美”化解方案,不过“金无足赤,人无完人”,缓存机制也有瑕疵,那就是数码过期的题材。一旦应用程序数据照旧页面结果值发生的更动,那么在缓存有效期范围内,你所获取的结果将是晚点的、不纯粹的多寡。大家可以想一想股票系统应用缓存所带来的苦难,当你拔取错误过期的数量去分析股市的风云变幻时,你会发觉赢得的结果真能够说是“失之毫厘,谬以千里”,看似大好的层面就会像赏心悦目的泡泡一样,用针一戳,转眼就消失得无影无踪。

DependencyFacade类封装了取得AggregateCacheDependency类型对象的逻辑,如此一来,调用者可以调用相关办法拿到创建连锁正视项的AggregateCacheDependency类型对象:
AggregateCacheDependency dependency =
DependencyFacade.GetCategoryDependency();

PetShop作为一个B2C的宠物网上商店,须求丰盛考虑访客的用户体验,如若因为数据量大而造成Web服务器的响应不霎时,页面和查询数据迟迟得不到结果,会因而而破坏客户走访网站的心境,在耗尽耐心的等候后,恐怕会失去这一有些客户。无疑,那是尤其倒霉的结果。由此在对其进展系统架构设计时,整个序列的属性就呈现殊为首要。可是,大家无法一曝十寒,因为在意于品质而忽略数据的不错。在PetShop
3.0版本以及在此以前的版本,因为ASP.NET缓存的局限性,这一题材并没有博得很好的化解。PetShop
4.0则引入了SqlCacheDependency特性,使得系统对缓存的处理相比之前大为改观。

要使得7.0大概2000本子的SQL
Server协理SqlCacheDependency性子,要求对数据库服务器执行相关的配置步骤。有二种艺术配置SQL
Server:使用aspnet_regsql命令行工具,或然应用SqlCacheDependencyAdmin类。

        string key = “product_by_category_” + category;
        IList data = (IList )HttpRuntime.Cache[key];

表4-1 SqlCacheDependencyAdmin类的基本点格局

内需建立正视项的数据库与数码表都配置在web.config文件中,其安装如下:
<add key=”CacheDatabaseName” value=”MSPetShop4″/>
<add key=”CategoryTableDependency” value=”Category”/>
<add key=”ProductTableDependency” value=”Product,Category”/>
<add key=”ItemTableDependency” value=”Product,Category,Item”/>

4.2.1  利用aspnet_regsql工具

        foreach (string tableName in tables)
            dependency.Add(new SqlCacheDependency(dbName, tableName));
    }
    public AggregateCacheDependency GetDependency()
   {
        return dependency;
    }
}

以PetShop.BLL.Product业务对象为例,PetShop为其成立了代办对象ProductDataProxy,并在GetProductByCategory()等方法中,引入了缓存机制,例如:
public static class ProductDataProxy
{

从职务分开与分支设计的角度解析,笔者更期待这几个Proxy对象是被定义在事情逻辑层中,而不像在PetShop的规划这样,被细分到代表层UI中。别的,假若急需考虑程序的可扩充性与可替换性,我们还足以为实际对象与代理对象建立统一的接口或抽象类。可是,单以PetShop的表示层调用来看,拔取静态类与静态方法的艺术,恐怕特别合理。大家须要谨记,“过度设计”是软件设计的警戒线。

4.2.2  利用SqlCacheDependencyAdmin类

SqlCacheDependency个性实际上是通过System.Web.Caching.SqlCacheDependency类来反映的。通过此类,可以在享有支持的SQL
Server版本(7.0,2000,2005)上监视特定的SQL
Server数据库表,并创设依赖于该表以及表中数据行的缓存项。当数据表或表中特定行的数量暴发变更时,具有正视项的数目项就会失灵,并自行从Cache中除去该项,从而保障了缓存中不再保留过期的多少。
由于版本的原因,SQL Server 2005截然协助SqlCacheDependency性情,但对于SQL
Server 7.0和SQL Server
2000而言,就从不那样幸运了。终究这一个制品出现在.Net Framework
2.0在此以前,由此它并不曾兑现自动监视数据表数据变动,通告ASP.NET的意义。消除的法门就是采纳轮询机制,通过ASP.NET进度内的一个线程以指定的年华间隔轮询SQL
Server数据库,以跟踪数据的变动情形。

设若急需对UI层采取缓存机制,将应用程序数据存放到缓存中,就可以调用这一个代理对象。以ProductsControl用户控件为例,调用形式如下:
productsList.DataSource =
ProductDataProxy.GetProductsByCategory(categoryKey);

争执于应用程序缓存而言,页输出缓存的使用特别广阔。它能够经过内存将处理后的ASP.NET页面存储起来,当客户端再五次访问该页面时,可以节省页面处理的历程,从而增强页面访问的质量,以及Web服务器的吞吐量。例如,在一个电子商务网站里,用户要求常常查询商品音信,这一个进度会涉嫌到数据库访问以及查找条件的同盟,在数据量较大的意况下,如此的检索进程是比较耗时的。此时,利用页输出缓存就足以将首先次搜索得到的查询结果页存储在缓存中。当用户第二次询问时,就足以省去数据查询的经过,收缩页面的响应时间。

一旦大家定义了之类的数据库连接字符串:
const string connectionStr = “Server=localhost;Database=MSPetShop4”;

当执行上述的四条命令后,aspnet_regsql工具会在MSPetShop4数据库中树立一个名为AspNet_SqlCacheTablesForChangeNotification的新数据库表。该数据表包括多少个字段。字段tableName记录要追踪的数据表的称呼,例如在PetShop
4.0中,要记录的数据表就概括Category、Item和Product。notificationCreated字段记录开端追踪的岁月。changeId作为一个品种为int的字段,用于记录数据表数据发生变化的次数。如图4-2所示:

比起从来调用DependencyAccess类的GetDependency()方法而言,除了艺术更简约之外,同时它还对CacheDependencyAssembly配置节举办了判断,倘若其值为空,则赶回null对象。

4.3 在PetShop 4.0中ASP.NET缓存的兑现

据悉种种数据表间的借助关系,由此差别的数据表需求树立的依赖性项也是不雷同的,从配置文件中的value值可以见到。但是不管建立看重项的数码,其创建的一坐一起逻辑都是形似的,由此在规划时,抽象了一个同步的类TableDependency,并经过创设带参数的构造函数,落成对依赖项的树立。由于接口方法GetDependency()的落到实处中,重回的目的dependency是在受保险的构造函数创造的,因而那里的兑现形式也可以当作是Template
Method情势的灵活运用。例如TableDependency的子类Product,就是运用父类的构造函数建立了Product、Category数据表的SqlCacheDependency看重:
public class Product : TableDependency
{
    public Product() : base(“ProductTableDependency”) { }
}

4.3.5  引入Proxy模式

WebUtility静态类被表示层的好多页面所调用,例如Product页面:
public partial class Products : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Page.Title =
WebUtility.GetCategoryName(Request.QueryString[“categoryId”]);
    }
}

与工作逻辑层Product对象的GetProductsByCategory()方法相比较,扩展了缓存机制。当缓存内不设有相关数据项时,则间接调用业务逻辑层Product的GetProductsByCategory()方法来获取数据,并将其与相应的AggregateCacheDependency对象一起存储在缓存中。

此起彼伏了割肉医疮类TableDependency的Product、Category和Item类均须求在调用时创建各自的对象。由于它们的父类TableDependency落成了接口IPetShopCacheDependency,由此它们也直接达成了IPetShopCacheDependency接口,那为已毕工厂情势提供了前提。

4.3.3  CacheDependency工厂

为了便利调用者,就像是大家得以对DependencyAccess类举行改革,将本来的CreateCategoryDependency()方法,修改为创建AggregateCacheDependency类型对象的情势。

在.Net
Framework中,应用程序缓存通过System.Web.Caching.Cache类完毕。它是一个密封类,不可以被延续。对于各个选拔程序域,都要开创一个Cache类的实例,其生命周期与行使程序域的生命周期保持一致。大家可以拔取Add或Insert方法,将数据项添加到应用程序缓存中,如下所示:
Cache[“First”] = “First Item”;
Cache.Insert(“Second”, “Second Item”);

ASP.NET提供了二种为主的缓存机制来提供缓存功效。一种是应用程序缓存,它同意开发者将顺序生成的多寡或报表工作对象放入缓存中。其它一种缓存机制是页输出缓存,利用它,可以一向拿到存放在缓存中的页面,而不须求通过繁杂的对该页面的重新拍卖。

4.1  ASP.NET缓存概述

4.3.4  引入Facade模式

作为.Net框架下开发Web应用程序的主打产品,ASP.NET丰硕考虑了缓存机制。通过某种形式,将系统需要的多寡对象、Web页面存储在内存中,使得Web站点在必要得到这个多少时,不须要经过繁琐的数据库连接、查询和复杂的逻辑运算,就足以“触手可及”,如“毫不费劲”般不难而飞快,从而进步总体Web系统的本性。

aspnet_regsql工具位于Windows\Microsoft.NET\Framework\[版本]文件夹中。若是直白双击该工具的执行文书,会弹出一个辅导对话框,指示大家成功相应的操作:

除开,执行该命令还会为MSPetShop4数据库添加一组存储进程,为ASP.NET提供查询追踪的数据表的气象,同时还将为使用了SqlCacheDependency的表添加触发器,分别对应Insert、Update、Delete等与数码变动相关的操作。例如Product数据表的触发器:
CREATE TRIGGER dbo.[Product_AspNet_SqlCacheNotification_Trigger] ON
[Product]
    FOR INSERT, UPDATE, DELETE AS BEGIN
    SET NOCOUNT ON
    EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N’Product’
END

        if (!enableCaching)
            return product.GetProductsByCategory(category);

4.3.1  CacheDependency接口

那就是说为数据库MSPetShop4启用SqlCacheDependency对象更改通告的完毕为:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
   {
       SqlCacheDependencyAdmin.EnableNotifications(connectionStr);
   }
}

动用页输出缓存,并且使用ControlCachePolicy设置输出缓存,可以将业务数据与整个页面放入到缓存中。那种措施比起应用程序缓存而言,在品质上有很大的滋长。同时,它又通过引入的SqlCacheDependency个性有效地幸免了“数据过期”的瑕疵,由此在PetShop
4.0中被广泛使用。相反,在此以前为Product、Category、Item业务对象建立的代理对象则被“投闲散置”,仅仅作为一种设计方式的来得而“幸存”与成套种类的源代码中。

咱俩也足以运用编程的方法来来管理数据库对SqlCacheDependency天性的运用。该类蕴含了三个根本的法子:

在PetShop.Web的App_Code文件夹下,静态类WebUtility的GetCategoryName()和GetProductName()方法调用了DependencyFacade类。例如GetCategoryName()方法:
public static string GetCategoryName(string categoryId)
{
     Category category = new Category();
     if (!enableCaching)
            return category.GetCategory(categoryId).Name;

CacheDependency的完结正是为Category、Product和Item数据表建立了对应的SqlCacheDependency类型的依赖性项,如代码所示:
public abstract class TableDependency : IPetShopCacheDependency
{
    // This is the separator that’s used in web.config
    protected char[] configurationSeparator = new char[] { ‘,’ };

咱们还足以为应用程序缓存添加倚重项,使得看重项产生变动时,该多少项可以从缓存中移除:
string[] dependencies = {“Second”};
Cache.Insert(“Third”, “Third Item”,
new System.Web.Caching.CacheDependency(null, dependencies));

PetShop
4.0引入了SqlCacheDependency特性,对Category、Product和Item数据表对应的缓存进行了SQL
Cache
Invalidation技术。当对应的数据表数据发生变动后,该技能可以将有关项从缓存中移除。达成这一技术的为主是SqlCacheDependency类,它继续了CacheDependency类。不过为了保证整个架构的可扩充性,我们也允许设计者建立自定义的CacheDependency类,用以扩充缓存依赖。那就有必不可少为CacheDependency建立抽象接口,并在web.config文件中进行陈设。

如图4-1所示中的提醒音讯,表明该引路主要用于配置SQL
Server数据库,如membership,profiles等信息,借使要布署SqlCacheDependency,则须求以命令行的点子举办。以PetShop
4.0为例,数据库名为MSPetShop4,则下令为:
aspnet_regsql -S localhost -E -d MSPetShop4 -ed

动用Facade方式能够将一部分繁杂的逻辑举办打包,以方便调用者对这几个纷纭逻辑的调用。就恍如提供一个联合的糖衣一般,将中间的子系统封装起来,统一为一个高层次的接口。一个优异的Facade格局示意图如下所示:

页输出缓存分为整页缓存和有些页缓存。我们可以经过@OutputCache指令完毕对Web页面的出口缓存。它根本涵盖三个参数:Duration和VaryByParam。Duration参数用于安装页面或控件举行缓存的时间,其单位为秒。如下的装置表示缓存在60秒内有效:
<%@ OutputCache Duration=“60“ VaryByParam=“none“ %>

    protected AggregateCacheDependency dependency = new
AggregateCacheDependency();
    protected TableDependency(string configKey)
    {
        string dbName =
ConfigurationManager.AppSettings[“CacheDatabaseName”];
        string tableConfig =
ConfigurationManager.AppSettings[configKey];
        string[] tables = tableConfig.Split(configurationSeparator);

如若要调用表4-1中所示的相关方法,须要小心的是访问SQL
Server数据库的帐户必须有所成立表和存储进度的权杖。假使要调用EnableTableForNotifications方法,还须要拥有在该表上创造SQL
Server触发器的权柄。

AggregateCacheDependency是.Net Framework
2.0新增的一个类,它肩负监视依赖项对象的会聚。当以此集合中的任意一个凭借项对象爆发转移时,该敬服项对象对应的缓存对象都将被电动移除。
AggregateCacheDependency类起到了整合CacheDependency对象的功效,它可以将三个CacheDependency对象竟是不一样品种的CacheDependency对象与缓存项建立关联。由于PetShop需求为Category、Product和Item数据表建立器重项,由此IPetShopCacheDependency的接口方法GetDependency()其目标就是回去建立了那几个看重项的AggregateCacheDependency对象。

在PetShop
4.0中,依旧接纳了布署文件和反光技术来贯彻工厂情势。命名空间PetShop.CacheDependencyFactory中,类DependencyAccess即为成立IPetShopCacheDependency对象的厂子类:
public static class DependencyAccess
{       
    public static IPetShopCacheDependency CreateCategoryDependency()
    {
        return LoadInstance(“Category”);
    }
    public static IPetShopCacheDependency CreateProductDependency()
    {
        return LoadInstance(“Product”);
    }
    public static IPetShopCacheDependency CreateItemDependency()
    {
        return LoadInstance(“Item”);
    }
    private static IPetShopCacheDependency LoadInstance(string
className)
    {
        string path =
ConfigurationManager.AppSettings[“CacheDependencyAssembly”];
        string fullyQualifiedClass = path + “.” + className;
        return
(IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
    }
}
整个工厂格局的达成如图4-3所示:

如此一来,ASP.NET会对txtCity控件的值进行判定,唯有输入的值与缓存值相同,才从缓存中取出相应的值。那就有效地幸免了因为值的不等而造成出口错误的多少。

固然说编程格局予以了程序员更大的油滑,但aspnet_regsql工具却提供了更简单的措施完结对SqlCacheDependency的安排与治本。PetShop
4.0应用的正是aspnet_regsql工具的方法,它编写了一个文书名为InstallDatabases.cmd的批处理公事,其中蕴藏了对aspnet_regsql工具的实施,并透过安装程序去调用该公文,完结对SQL
Server的配置。

    private static readonly int productTimeout =
int.Parse(ConfigurationManager.AppSettings[“ProductCacheDuration”]);
    private static readonly bool enableCaching =
bool.Parse(ConfigurationManager.AppSettings[“EnableCaching”]);
       
    public static IList
GetProductsByCategory(string category)
    {
        Product product = new Product();

与之相应的是缓存中多少项的移除。后边提到ASP.NET可以活动管理缓存中项的移除,但大家也足以经过代码编写的方法显式的移除相关的多寡项:
Cache.Remove(“First”);

Leave a Comment.