• 体验ASP.NET 2.0中的BuildProvider(转载)


    ASP.NET 2.0的及时编译模型和ASP.NET 1.1是不一样的,微软重新设计了ASP.NET 2.0的页面生成过程,使这个过程可以更灵活的被控制。

        具体的过程我这里就不再重复的写了,大家可以参看底下两篇文章:
        《Inside ASP.NET 2.0-即时编译系统》
        《Jaw-dropping experience with custom build providers》

        在ASP.NET 2.0中我们可以通过实现自己的BuildProvider来实现编译特殊文件的效果。文件的内容是没有限定的,只要你能在BuildProvider中解析文件,并返回.NET的CodeDom就可以。所以,你甚至可以用自己的编程语言开发ASP.NET程序。
        其实ASP.NET 2.0中的一些新特性就是通过BuildProvider实现的,比如.ashx文件,MastPage等,你可以从.NET安装目录下的CONFIG文件夹中的web.config中找到这些默认的BuildProvider配置。

        下午简单做了个试验,通过自定义的xml格式配置文件生成实体类的代码。只要在App_Code目录下放如下格式的.dbconfig文件,ASP.NET就会通过自定义的BuildProvider生成一个实体类的程序集,你还能从代码编辑器的智能感知中看到这个程序集的类,是不是很酷 :)

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <Database connection="">
     3   <Tables>
     4  
     5     <Table name="Members">
     6       <Columns>
     7         <Column name="ID"     type="Integer" />
     8         <Column name="Name"   type="VarChar" />
     9         <Column name="Email"  type="VarChar" />
    10       </Columns>
    11     </Table>
    12  
    13     <Table name="WorkItems">
    14       <Columns>
    15         <Column name="ID"         type="Integer" />
    16         <Column name="Subject"    type="VarChar" />
    17         <Column name="Remark"     type="VarChar" />
    18         <Column name="Created_On" type="DateTime" />
    19       </Columns>
    20     </Table>
    21  
    22   </Tables>
    23 </Database>

        通过上面配置文件生成的程序集在编辑器中职能感知的效果:

        

        

        要实现以上效果还要在Web.config文件中的system.web节加上这段配置,它声明把.dbconfig文件交给EntityBuildProvider处理。

    1 <compilation debug="true">
    2             <buildProviders>
    3             <add extension=".dbconfig" type="MyBuildProvider.EntityBuildProvider"/>
    4             </buildProviders>
    5             </compilation>

        关于compilation配置节点的更多内容可以参考MSDN上的:
        《compilation 元素(ASP.NET 设置架构)》

    自定义BuildProvider需要用到CodeDom相关的知识,如果你之前对CodeDom了解不是很多,可以参考这两篇文章:
        《Microsoft .NET CodeDom Technology - Part 1》
        《Microsoft .NET CodeDom Technology - Part 2》

        通过下午的实验,发现BuildProvider虽然强大,但是只能在WebSite项目下使用。在WebApplication项目中使用是没有效果的….暂时还没有找到在WebApplication模式下的替代方案。如果哪位高手知道,麻烦留言教教我。

        最近在琢磨怎么把Blog的模板系统做的扩展性高,用户体验好,又不影响执行效率。所以就接触到了BuildProvider和其他一些ASP.NET中比较不常用的高级特性。约琢磨越反而越多东西不明白,不过也学到很多以前没有去注意的东西,哈哈。

        如果要对ASP.NET的完整请求处理过程包括动态编译过程有更深入了解,目前我所知道的最好办法就是用Reflector打开System.Web程序集,从HttpRuntion.ProcessRequest开始看起。并结合《A low-level Look at the ASP.NET Architecture》    这篇关于ASP.NET 1.1的文章进行学习。如果你有更好办法请告诉我 ;-)

        我下午做的实验项目:
        buildproviderdemo.rar

    注意:
        1.如果WebSite项目因为路径改变没有包含到项目中,请手动重新包含一次
        2.可以看到效果的只有MyBuildProvider.Demo项目,BuildProviderDemo项目是WebApplication类型的BuildProvider不起作用。
        3.如果你的VisualStudio 2005不是Team Suite版本的,可能需要移掉单元测试项目才能打开解决方案。
        4.如果你没有装WebApplication项目的模板或者VS 2005 SP1,那BuildProviderDemo项目也要去掉。

  • 相关阅读:
    内蒙古草原之行
    【iOS开发笔记25/50】:正则表达式
    读书笔记:《写给大家看的设计书》
    【iOS开发笔记22/50】:恼人的a valid provisioning profile for this executable was not found错误
    【搞定GTD】打造高效的OmniFocus系统
    【iOS开发笔记24/50】调整UIImage的大小
    【iOS开发笔记26/50】我自己写的苹果应用程序XQViewer终于上架了,解决了一系列的问题,终于挺过来了
    桥牌笔记:双挤
    养成一个习惯需要几年,而毁掉一下习惯只需要一天
    使用SuperMemo背单词2000天,抓图纪念一下!
  • 原文地址:https://www.cnblogs.com/chenying99/p/2199164.html
Copyright © 2020-2023  润新知