zoukankan      html  css  js  c++  java
  • Razor使用Parse()时最好指定“缓存名”

    为什么?

    本文的标题,明显有一种提醒的口吻。

    从18年的生活经验看,如果想提醒人要怎么办,不要怎么办。

    最好说明原因。那么小编开始说明原因喽。

    哦对,说原因之前,先说交代一下背景,一句话 在非mvc下使用Razor模板引擎。(end)

    仍然是这个流程图,我们知道Razor模板引擎,在工作的时候是生成C#代码执行,生成程序集,再调用程序集生成html。

     

    也就是说如果没有意外的话,每次请求,都会生成一个程序集。(会反复执行图中黄圈里的代码。)

    而我们知道这些生成程序集是非常耗时的,而且多个程序集会占用资源。

    这就是小编强调要的指定缓存名的原因。那么我们接下来看看如何使用“缓存”。

    其实说起来复杂,做起来很容易!

    clipboard[5]

     

    如何使用

    1.指定缓存名会变得快一些

    这样一段代码。

    string cshtml =File.ReadAllText("路径");

    for(int i =0;i<500;i++)

    {

         // 在这个例子中,会形成500个随机命名的程序集

         string html1 = Razor.Parse(cshtml);

         //在这个例子中,解析cshtml文件,同时给了一个“缓存名”。

         //这次一旦编译成功,下次Parse()就不再重复编译。直到cshtml文件被修改。

         string html2 = Razor.Parse(cshtml,null,"cccc");//"cccc"是随意起的名字。

    }

    刚刚说的“缓存名”可能有点含糊,我也不知道怎么叫这个东西。就是上文例子中的

    “cccc”,给了这个参数后,以后的相同请求就不再重新随机命名的去创建了。

    2.指定什么名合适?

    我这个例子中的做法是【cshtml文件全路径】+【文件上次修改时间】的一种策略。

    当然也可以用文件的md5啊什么的。

    我的理解是,只要能唯一识别一个cshtml文件即可。(当然,不止同名。文件修改前和文件修改后不算同一个文件。)

      string fullpath ="全路径";

      string cshtml  = File.ReadAllText(fullpath);

      //“缓存名” =【cshtml文件全路径】+【文件上次修改时间】

      string cacheName = fullpath + File.GetLastWriteTime(fullpath);

      Razor.Parse(cshtml,null,cacheName);

    3.封装一个RazorHelper

    基于以上 1、2的观点(1.指定"缓存名" 2.“缓存名“=【cshtml文件全路径】+【文件上次修改时间】

    本文讨论的问题已然解决,但是经过1、2操作以后,多出来好多代码,而且这些代码是可以复用的。

    所以呢,封装一个RazorHelper把1.2.对应的代码扔到一个方法里去。

    public class RazorHelper

    {

         //直接敲的,没VS就不写文档注释了。

        public static string Parse(HttpContext context,

                       string cshtmlVirtualPath,Object model)

       {

              string fullpath = context.Server.MapPath(cshtmlVirtualPath);

              string cshtml = File.ReadAllText(fullpath);

              string cacheName = fullpath+File.GetLastWriteTime(fullpath);

              string html =Razor.Parse(cshtml,model,cacheName);

              return html;

       }

    }

    当然RazorHelper只有这么一个方法的话,有点逗B。。。

    接下来的几篇文章里,我会逐步让他丰富起来。

     

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/mcad/p/4347410.html
Copyright © 2011-2022 走看看