zoukankan      html  css  js  c++  java
  • 体验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项目也要去掉。

  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/chenying99/p/2199164.html
Copyright © 2011-2022 走看看