提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-08-25 10:37:12.000|阅读 471 次
概述:ParsedRoute是ASP.NET Routing中的内部类,作用是根据既定模式将一段URL解析为一个RouteValueDictionary。上次的文章中我主要谈了如何利用反射使用类库的内部成员,而这次则想分享一些使用ParsedRoute时产生的一些想法。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
上午搬家,东西整理得头大,吃了很多灰,有些头晕,不过把东西积累着也不爽,就写了吧。
ParsedRoute是ASP.NET Routing中的内部类,作用是根据既定模式将一段URL解析为一个RouteValueDictionary。我主要谈了如何利用反射使用类库的内部成员,而这次则想分享一些使用ParsedRoute时产生的一些想法。
首先,这里我想谈一下同学在那篇文章后面所指出的问题。他认为我们不应该使用类库的内部成员,以下是他的原文评论:
用内部函数的风险是,他既然没有推荐,那就有不推荐使用的理由:只适用于特定功能、有特定的局限性……还有版本升级带来的影响等等。
而对于根本不知道内部结构就贸然调用内部方法,再多的单元测试也不能保证正确,人家也根本没有保证过你任何东西,只是你的猜测。
如果真想用类似的功能,有两个途径:
第一,找公共类库,如果是极为通用的功能肯定会有公共类库,一个有承诺的接口支持。
第二,拷贝源码。直接将源码拷贝出来自己的类中使用。这样可以保证代码的稳定性,不会因版本升级改变。而且你也可以分析、改进源码。其实基本上就算是自己的源码了。
我同意他的部分看法,尤其是使用内部函数的风险,这也是“不使用内部函数”最重要的原因。不过我也认为,在某些情况下还是适合使用一个类库的私有实现的。
例如,我们希望开发的功能便是在“扩展现有的实现”,这在一定程度上要求我们的实现与扩展目标较为接近。于是,我们需要的一些基础功能(例如字符串解析),可能也已经是现有实现的一部分,只是由于现有类库没有将其公开,我们往往需要重复开发相同的功能。如果有现成的公开实现,那么自然不会使用这种Hack的方式。但是如果没有,我就会倾向与使用类库内部已有的功能。正是基于这种考虑,我会复用ParsedRoute,因为我希望可以使用ASP.NET Routing中相同的模式,进行相同的字符串捕获和构造功能。
自然,在这之前我会阅读这部分实现的代码,确保它能够满足我的需求,再通过这种方式进行调用。徐同学认为,如果读完之后,应该将其复制出来,放入自己的系统,便于修改。但是有些功能,它对外的接口简单,但是内部实现可能涉及到数千行代码,十几组件之类的交互(例如运用的地方),与此相比,我还是倾向于简单地封装一下接口,并使用充足的单元测试来确保这些功能。
在使用内部功能的时候,单元测试尤其重要(当然平时单元测试也是很重要的)。由于内部功能的确是相对容易改变的地方,我们必须使用单元测试来保证正在使用的那部分功能不会出现问题——或者说,一旦出现问题,我们可以立即发现,并将其替换成自己的实现,或改变内部方法的调用方式(毕竟完全大改的可能性也不太高)。如果您没有编写单元测试的习惯,也请务必为这部分功能写单元测试,否则还是放弃这种做法吧。
不过对于一些普遍使用的基础功能(例如一些数据结构,容器等等),我还是倾向与使用公开实现或直接将代码拷贝出来。例如,WPF中提供了internal的ReadOnlyDictionary类型,在需要的时候便会将其实现复制到自己的项目中。甚至于在使用公开的类时也会这样,因为我不想在一个普通的项目中依赖一个WPF类库——写到这里,我忽然有些理解了。
真的不容易。
还有便是ParsedRoute的功能,它其实拥有两个接口,Match和Bind:
internal class ParsedRoute { public RouteValueDictionary Match( string virtualPath, RouteValueDictionary defaultValues) { ... } public BoundUrl Bind( RouteValueDictionary currentValues, RouteValueDictionary values, RouteValueDictionary defaultValues, RouteValueDictionary constraints) { ... } }
Match方法的功能是将URL(即virtualPath)解析为一个RouteValueDictionary,而Bind的作用是根据几个RouteValueDictionary集合构造一个URL。但这里我认为,ParsedRoute类的设计是一个典型的反面教材。
例如,在ASP.NET Routing中是这样使用ParsedRoute类的。开发人员使用的是公开的Route类,提供一个模式字符串(如"{controller}/{action}/{id}")和其他一些默认值,约束(constraint)等设置,而Route会把一部分职责交给ParsedRoute完成。在URL解析阶段,Route类会使用Match方法解析字符串,然后在Route类内部进行约束控制。但是在Bind阶段,对于ParsedRoute却在直接使用这些约束。简单地说,ParsedRoute一会儿知道有“约束”这个东西,一会儿又不知道,它的职责在进行不同工作的时候具有比较明显的变化。因此我认为它设计的不合适。
因此,我在使用ParsedRoute的时候,无论是解析还是构造URL时,都不会提供约束条件(今后会有更多相关内容)。
还有便是,contstraints使用RouteValueDictionary进行保存,它其实是一个IDictionary<string, object>容器。在执行的时候,ASP.NET Routing中会判断这个object对象的类型,如果是字符串则把它作为正则表达式来使用,如果是IRouteConstraint对象则另有一番逻辑,否则就会抛出异常。我不喜欢这个设计,这个做法不够面向对象。虽然OO不是需要严格遵循的准则,但是现在的做法隐藏了太多,假设了太多,我并没有看出它有什么好处。难道仅仅是为了方便?
您有什么想法呢?您会如何使用类库内部的功能?您对ParsedRoute的设计怎么看?
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢