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。。。

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

     

  • 相关阅读:
    swift 中 Self 与self
    Swift 中的泛型
    mac 报文件已损坏 怎么办
    winxp秘钥
    字符串拷贝函数strcpy, strcat, sprintf, strncpy, strncat和snprintf的区别
    【原创】Linux应用程序完整调用自己写的字符设备驱动过程
    idea中新建git分支,并提交到远程github
    (JS-PHP)使用RSA算法进行加密通讯
    Linux日志相关的命令
    hibernate中关于is null的查询
  • 原文地址:https://www.cnblogs.com/mcad/p/4347410.html
Copyright © 2011-2022 走看看