如果你既想学习ASP.NET AJAX,又想学习Windows Workflow Foundation,还想学习LINQ(包括DLinq和XLinq),能够一次过满足你三个愿望的除了Kinder出奇蛋就是本期Random Clipping重点推荐的这篇文章了。

Build Google IG like Ajax Start Page in 7 days using ASP.NET Ajax and .NET 3.0

点击链接打开文章后,相信大部分读者的第一反应都是“哇!那么长,怎么可能看得完啊!”既然文章标题说是用7天时间来制作一个这样的首页,那么你也可以先用del.icio.us把文章收藏下来然后分开几天看。想学新东西当然就要花点时间的啦,当你耐心把Omar Al Zabir这7天的开发记录读完,再结合源代码深入理解一下它的设计,相信你就能对它所用的几种新技术都会有所了解,至少知道在什么开发场景下使用什么能够为你节省时间提高效率。如果你觉得本文也太长了,那么也可以考虑先收藏下来,等到有时间了再看。

简介

首先,我们来看看工作记录之前的介绍部分。第一节的Introduction说明了这个项目的实现结果是比较贴近真正的Google IG的,它允许拖放小部件(widget)、完全个性化的页面、支持多页面等。并且说明它不是一个原型项目或样例项目,而是一个真正在运作的开源的首页:http://www.dropthings.com/。你可以在日常生活中使用它,也可以使用ASP.NET为它开发更多的小部件。

如果你看到这里,还是不是很明白所谓的“首页”是什么,第二节的What is an Web 2.0 Ajax Start page给出了详细的解释。接着第三节的Features简单说明了其功能,其实这些功能就和Google IG几乎完全一样,没有添加任何新的东西。我觉得这个项目对比Google IG,真正应该强调的功能是你可以好像开发普通UserControl那样为它设计小部件(widget),而不需要懂XML和JavaScript,而这正是第四节Widgets所讲的。第五节Technologies说了此项目所用到的技术,看不到ASP.NET AJAX Future CTP字眼吧?那意味着你无需伸手去碰JavaScript了,AJAX实现所需要的最多就是编写服务器端代码调用一下UpdatePanel和Extender。

分层

接下来从分层的角度来了解一下此项目的特色层,包括Web Layer和Data Access using DLinq。在Web Layer小节,作者强调的是“整个应用也就是一个页面”,并且例如加载当前用户设置这样的常见任务是通过调用Workflow来完成的,还通过实测数据说明了Workflow自身的运行时间是很短的。

在Data Access using DLinq小节,作者强调的是使用DLing所附带的SqlMetal.exe来直接生成数据访问类,这些类包含了所有的数据访问代码以及实体(entity)类。然后作者拿DLing根第三方ORM工具比较,说明DLing特有的Projection技术能够根据你所需要的字段生成对应的属性,这个依赖于定制编译器的功能所以是第三方ORM工具暂时无法实现的,它给你带来的好处就是效率的提升,因为你实际上并没有SELECT那些你不会用到的字段。作者还说,如果你不相信DLinq的表现,或者对DLinq抱有一种不怎么好的感觉的话,可以直接用SQL Profiler看看DLinq让数据库实际执行的SQL语句到底是怎么样的。

第一天:使用UpdatePanel制作Widget容器

正所谓万事开头难,第一天要设计的Widget容器也是不容易的,别看最终生成的就是简单的几层嵌套div,要让它能展开/折叠和能被拖放,并且执行起来符合效率要求,就不那么容易。

在这一节里面,你需要重点注意到的就是Extender放置问题,这让设计如何嵌套成为了一个难题。假如Extender放置在UpdatePanel内,每次UpdatePanel更新都会导致整个Extender的客户端代码被销毁然后重新生成,也就要重新初始化一次,最终导致效率低下。因此,要尽量确保Extender都在UpdatePanel的外面,而最终的嵌套设计方案可以看作者的图示。

至于WidgetContainer,它继承自IWidgetHost,这种设计为将来的扩展预留了足够的空间。当前设计的Widget,可以依赖于WidgetContainer的一些特有的功能,也可以仅仅依赖于IWidgetHost从而将来适应其他IWidgetHost容器。

第二天:制作定制的拖放Extender和多栏放置区域

在这一节里面,作者解释了为什么原有的拖放Extender都不适用于此项目的情景,从而需要自己设计一个新的Extender。其实我也认为ASP.NET AJAX和Control Toolkit自带的各种拖放功能确实限制多多,并不能根据你的开发场景所需要灵活定制,所以使用ASP.NET AjAX时几乎可以肯定如果你需要使用拖放就要自己写。当然,这不一定需要从头写起,Future CTP内置了客户端的拖放管理器,你只需要实现两个接口就可以实现拖放。

另外大多数的Extender都是通过异步Postback时在服务器端保存状态,而这对于的首页来说是不可能的,因为用户一次拖放后很可能马上就要进行下一次的拖放,所以这个定制的拖放Extender通过调用Web Service来保存状态。

第三天:制作数据访问层和站点加载

作者在这一节里展示了此项目的数据库设计,并且说明了如何跨层地通过DLinq访问数据。跨层使用DLinq的问题就在于,如果你的实体用于各个不同的层,那么它就从加载它的DataContext分离(detach)出来了,通常业务逻辑层是没有DataContext的,所以你要将它发回到数据访问层然后利用DataContext更新,通常我们的做法是业务逻辑层修改实体然后再发回给数据访问层,而DLinq则要求先把实体附加(attach)到DataContext再作出修改然后提交更新。

作者使用了delegate来解决这个问题,调用数据访问层的更新函数时传入一个delegate,然后数据访问层把实体附加到DataContext,接着调用该delegate,最后提交更新。而该delegate指向的函数则放在业务逻辑层,这样就保持了原来的分层,并且按照DLinq所需的方式来完成更新,虽然这导致调用在两个层之间往返多了一次。另外,同样的设计方式可用于插入与删除。

第四天:使用XLinq制作Flickr照片与RSS小部件

作者想做的第一个小部件用于显示Flickr照片。首先通过XElement把RSS加载上,然后使用XLinq将XML影射为对象集合,接着还是通过XLinq迭代集合中特定范围的对象并且构建对应的控件树,就那么简单,通用的RSS小部件也用类似的方式制作。想象一下如果没有XLinq你会如何去完成这部分功能,再看看作者给出的代码,你就知道XLinq为你节省多少时间了。

值得注意的是,作者使用了HtmlGenericControl来生成链接,而不是用HtmlLink,因为HtmlLink不允许有子控件,这是它特有的一个局限,而HtmlGenericControl就能很好的解决此问题。

第五天:制作业务逻辑层中的工作流

这是问题多多的一天,把DLinq和WinFX混合在一起不是一件容易的事情,作者就需要解决以下问题:

  • 在ASP.NET中同步调用Workflow
  • Workflow运行完后将对象取出来
  • 在一个Workflow同步调用另一个Workflow

第一个问题通过对WorkflowRuntime添加两个Service解决了。第二个问题,通过创建一个叫做CallWorkflowActivity的新Activity来解决,这个Activity的实现非常复杂,有兴趣了解其细节的朋友可以看这篇文章:A workflow sample。由于Workflow本身是设计为异步执行的,然而ASP.NET的服务器端处理却要求是同步的,所以才会遇到这两个问题。第三个问题源自Workflow是设计为可休眠的,这时候就要对它的数据进行序列化然后持久,然而DLinq的实体却不是可序列化的。解决这个问题的方式是把DLinq实体放到Dictionary<string, object>里面,从而通过要求对象可序列化的检查。

另外要在同一个项目里同时加载WinFX和DLinq的编译器是需要通过修改项目文件的,作者给出了修改方法。不过修改后Workflow的声明性Rules无法正常编译,因为.rules文件无法被正常识别为嵌入资源,这看起来是一条死路。直到第二天清晨,周围一片寂静,太阳准备升起,作者听到了来自天堂的神圣启示,然后明白到如何把这个问题解决掉,想了解详情的就仔细读读原文吧。

第六天:页面切换问题

页面切换时,新页面的小部件被第一次加载,而如果它们通过IsPostBack属性判断自己是否第一次加载的话,就会得到错误的信息,然后尝试根据ViewState恢复上一次的状态也就会失败,从而无法正常初始化。解决方法自然是通过WidgetContainer主动通知Widget这是不是你的第一次加载。

在这里我要加插一些题外话,我觉得这不是一个有效解决问题的办法。如果你设计一个Widget,在上面扔一个DataSourceControl和一个DataBoundControl,就可能导致加载失败,因为这些控件本身就设计为依赖于IsPostBack属性,它们自动根据IsPostBack属性来决定是否需要数据绑定。希望ASP.NET 3.0将这个问题解决了,因为我们确实会有需要动态加载DataBoundControl的时候,它们第一次加载时需要进行数据绑定,而此时IsPostBack属性却为true。

第七天:注册

是时候准备迎来第一个注册用户了,这时候需要将他在匿名访问时使用的设置复制到注册用户中去。因为匿名用户的信息不保存在aspnet_membership,而仅保存在aspnet_user和aspnet_profile,所以不能使用Membership.GetUser获取到匿名用户的实体然后获取其设置,这时候就需要手动访问数据库完成上述复制操作了。

在使用DLinq查询ASPNETDB之前,首先你要看Omar Al Zabir的另一篇文章:Careful when querying on aspnet_users, aspnet_membership and aspnet_profile tables used by ASP.NET 2.0 Membership and Profile provider。ASPNETDB里面的索引都是使用ApplicationId和LowerUserName或LowerEmail组合的,为了确保查询时通过索引以确保效率,你也必须使用上述组合作为查询条件。

收尾

因为这个项目混合了ASP.NET AJAX、WinFX和LINQ,所以必须有一个混合型的web.config以令它们和谐共处,这正是Web.config walkthrough小节要说的事情。接着Deployment Problem和How to run the code两个小节说明了你应该如何部署这个项目,并且让它运行起来。之后Next Steps小节说明了你可以使用ASP.NET为此项目开发更多的小部件,而Conclusion小节则说明了混合这3种技术到一个项目里是多么有挑战性的事情,不过它们也大大降低了你的开发难度。

总结

中间我跳过了How slow is ASP.NET Ajax这一小节没说,在这里作者说明了当一个页面的UpdatePanel和Extender的数量增加到一定程度时,客户端的执行速度将变得非常低。后来作者根据Scott Guthrie的提醒,在web.config中设置debug="false",这将关闭客户端脚本运行时的验证功能,执行速度已经比较好,在IE7、FF和Opera9中速度有明显的提升,然而在IE6中还是比较慢。

这说明了对于只有一个页面的AJAX应用来说,使用UpdatePanel和Extender并非是一个很好的解决方案,除非你有足够的能力通过各式hacking来提升执行效率。然而我觉得,如果你有那样的能力,干脆就用Future CTP开发以客户端为中心的AJAX应用好了,可以尽量减少对服务器端控件与Extender的依赖。

转载于:https://www.cnblogs.com/jacklaw/archive/2007/07/03/804724.html

英语阅读推荐:使用AJAX+WF+LINQ制作Google IG式首页相关推荐

  1. 英语阅读推荐:主题切换控件 ExpressionBuilder

    这里是Cat in dotNET的Random Clippings系列,专门向大家推荐.NET相关的英文技术文章,每期推荐两篇文章,第一篇适合于英语技术文章阅读的入门者练习阅读能力,而第二篇则适合于进 ...

  2. 初中英语多词性单词怎么办_高考英语阅读理解生僻单词太多怎么办?十大招数帮到你...

    英语阅读理解生僻单词太多怎么办?今天,胡老师告诉你猜词十大招数,帮助同学们英语考试拿高分.  01  构词法 阅读中常常会遇到一些由熟悉的单词派生或合成的新词.掌握构词法对猜测词义很有帮助.如:unf ...

  3. 【转载】【程序员练级】提高英语阅读水平经验分享上篇

    作为一名程序员,虽说每天都在和英语打交道   但是当看到一篇英语文档或者英语技术文章的时候还是比较头疼   尤其是使用Google搜索的时候,很多问题解决办法都是英文的   还有一些国外比较有名的网站 ...

  4. 程序员,5个步骤改善你的英语阅读技能

    最近,你读英语内容了吗? 如果你阅读了一篇英语blog或技术文档(如:MongoDB的Aggregation),你理解了多少. 摘自:HOW I'M FEELING ABOUT TURNING THI ...

  5. ✨英语学习|如何高效做英语阅读笔记

    首先,英语这门学科本身就是需要长期积累和学习,用则熟练,不用则殆,阅读文章是我们学习英语道路上不可避免的,但是,该怎样去阅读文章,怎样去做好笔记,需要注意一下几点: ✨✨✨✨阅读素材 从阅读素材这方面 ...

  6. 互联网快讯:晋江文学城将实施分年龄阅读推荐体系;三星SDI进军美国市场;猿辅导推出教育科技新品牌“飞象星球”

    国内要闻 北京2022冬奥会合作伙伴俱乐部轮值主席单位换届:安踏集团.中国石油.中国人保三家联合接棒: 方正证券:方正集团等五家公司已根据重整计划完成新方正集团的设立,并已取得<营业执照> ...

  7. 程序员英语阅读学习笔记

    平时可以 阅读 英文原版书籍,官方英文资料,搜索一些英文的技术相关(stackoverflow,谷歌),尝试翻译 等等 早上上班时间可以复习一些不懂的单词(有道词典) 最主要是每天坚持,不然一切不得行 ...

  8. 张璇计算机英语阅读教程,张璇 - 云南大学 - 软件学院

    个人简介 张璇,教授,博士,美国南加州大学及密歇根州立大学访问学者.主要研究方向包括需求工程.可信软件.软件过程和知识工程,主持国家自然科学基金项目3项.省部级项目10项,参与国家自然科学基金项目和国 ...

  9. 考试大考博经验谈:考博英语阅读理解

    北冥有鱼,其名为鲲.鲲之大,不知其几千里也:化而为鸟,其名为鹏. 鹏之背,不知其几千里也:怒而飞,其翼若垂天之云.鹏之徙于南冥也,水击三千里,抟扶摇而上者九万里--  --<庄子·内篇·逍遥游& ...

最新文章

  1. Linux Kernel 5.0 RC 7 发布
  2. 机器学习(5)--化无限为有限
  3. MySQL的系统数据库是_mysql数据库系统
  4. rest风格使用两个变量_为什么要用Rest风格,接口应该怎么定义,除了Rest还可用什么方式写接口的?...
  5. C#驱动级模拟按键操作
  6. python简单GUI(模拟记事本)
  7. 无人机未来有一大波创富平台
  8. 波斯顿动力机器人为啥那么牛逼?
  9. VS中的快捷键快速格式化代码,使好看,整齐
  10. 台式计算机网卡型号怎么查找,怎么确定台式机无线网卡驱动版本 台式机无线网卡驱动版本查看方法...
  11. Insyde uefi 隐藏设置_固件级安全,微软安全工具新增UEFI扫描功能
  12. 小米10pro手机电路图 主板元件位号图
  13. 查看浏览器占有的市场份额
  14. 产品设计学习(一)——梁宁产品思维大纲
  15. PTA-链表学习-----奇数值结点链表
  16. pandas计算店家的每日营业额示例
  17. 超详细的WMS仓储管理系统介绍——补货篇
  18. css中井号,点,星号的区别和应用实例。
  19. 分析时间序列数据的六个图表
  20. Ubuntu 复制文件到远端时错误,Permission denied 失败原因深度探索

热门文章

  1. python framework jdon_一天学会Python Web框架(十二)产品管理
  2. 解决虚拟机VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法
  3. python之路--嵌套函数、匿名函数、高阶函数。函数的递归
  4. HashMap和HashSet的区别
  5. String和int 转换
  6. C++ 的五个普遍误解
  7. 操作和维护经常使用的命令
  8. [转]图解APP的商业模式
  9. 基于JSP实现医院病历管理系统
  10. WritableComparable排序案例(区内排序)