深入了解Dynamic & DLR(二)
2011-09-23 11:33
253 查看
在上一篇随笔深入了解Dynamic & DLR(一)主要谈到在面向服务设计中,动态编程的必要性,并深入了解下dynamic这个关键字,以及它是如何在利用C#这门静态语言实现动态功能的。紧接上篇,一起来探讨下DLR ScripRuntime和两个常用类DynamicObject 和 ExpandoObject。
2.DLR ScriptRuntime
DLR(Dynamic Language Runtime),是微软的一个开源项目。为.NET应用程序提供了动态脚本注入技持。DLR构建的功能包含两个方面,一个是共享的动态类型系统,一个是标准的承载模型。但是VS2010并没有集成相关dll,大家可以从Codeplex获得源码,目前最新版本为1.0。这里不得不提到CLR,它是整个运行环境的基础,DLR也是运行在其之上的,这样是有显而易见的好处的,CLR的垃圾回收、JIT编译、安全模型,DLR也能享用这些底层架构功能,如果我们对垃圾回收进行优化,或者是提供某种功能,那么DLR相应的也能享用这种便利。DLR内部为了提高执行效率,会从自己先compile script,然后cache。有些类似JIT机制。避免重复加载,解析外部脚本。
在实际业务逻辑中,我们希望能够实时动态执行存储在文件中的代码或者完整一个业务逻辑功能,甚至我们可以动态选择脚本语言引擎,在应用程序域中动态生成脚本,并注入脚本,来达到控制业务逻辑的目的。在随笔一,我列举了一个场景,需要随意调整销售策略在所有POS机上,假设我们根据客户等级来进行折扣,VIP客户8折,荣誉客户9折,一般客户9.8折,并且金额达到5000时,再能进行9.8的折扣。UI我们假设使用winform。界面如下。
View Code
执行结果如下:
ExpandoObject的工作方式类似,不必重写方法。
ExpandoObject使用上和dynamic没什么区别, 有一点区别是不能仅仅是创建dynamic对象,而不去初始化它。创建dynamic的同时必须初始化它。另外ExpandoObject的GetType方法总是显示System.Dynamic.ExpandoObject.而DynamicObject则显示继承类的type。一般来说dynamic和ExpandoObject就可以满足我们的需要, 如果需要准确控制对象的binding,可以尝试使用DynamicObject,重写GET、SET方法来满足自己的需要。
以上是个人对Dynamic和DLR的一些认识和学习。欢迎各位童鞋互相探讨。
文章首发站点:www.agilesharp.com IT创业产品互推平台
2.DLR ScriptRuntime
DLR(Dynamic Language Runtime),是微软的一个开源项目。为.NET应用程序提供了动态脚本注入技持。DLR构建的功能包含两个方面,一个是共享的动态类型系统,一个是标准的承载模型。但是VS2010并没有集成相关dll,大家可以从Codeplex获得源码,目前最新版本为1.0。这里不得不提到CLR,它是整个运行环境的基础,DLR也是运行在其之上的,这样是有显而易见的好处的,CLR的垃圾回收、JIT编译、安全模型,DLR也能享用这些底层架构功能,如果我们对垃圾回收进行优化,或者是提供某种功能,那么DLR相应的也能享用这种便利。DLR内部为了提高执行效率,会从自己先compile script,然后cache。有些类似JIT机制。避免重复加载,解析外部脚本。
在实际业务逻辑中,我们希望能够实时动态执行存储在文件中的代码或者完整一个业务逻辑功能,甚至我们可以动态选择脚本语言引擎,在应用程序域中动态生成脚本,并注入脚本,来达到控制业务逻辑的目的。在随笔一,我列举了一个场景,需要随意调整销售策略在所有POS机上,假设我们根据客户等级来进行折扣,VIP客户8折,荣誉客户9折,一般客户9.8折,并且金额达到5000时,再能进行9.8的折扣。UI我们假设使用winform。界面如下。
View Code
static void Main(string[] args) { dynamic user = new DynamicUser(); user.NickName = "Loong"; Console.WriteLine(user.GetType()); Console.WriteLine(user.NickName); Func<string, string> GetWelcomeMsg = name => string.Format("welcome {0}", name); user.GetMsg = GetWelcomeMsg; Console.WriteLine(user.GetMsg("Loong")); Console.ReadLine(); }
执行结果如下:
ExpandoObject的工作方式类似,不必重写方法。
dynamic expUser = new ExpandoObject(); expUser.NickName = "loong2"; Console.WriteLine(expUser.GetType()); Console.WriteLine(expUser.NickName); Func<string, string> GetWelcomeMsg = name => string.Format("welcome {0}", name); expUser.GetMsg = GetWelcomeMsg; Console.WriteLine(expUser.GetMsg("Loong"));
ExpandoObject使用上和dynamic没什么区别, 有一点区别是不能仅仅是创建dynamic对象,而不去初始化它。创建dynamic的同时必须初始化它。另外ExpandoObject的GetType方法总是显示System.Dynamic.ExpandoObject.而DynamicObject则显示继承类的type。一般来说dynamic和ExpandoObject就可以满足我们的需要, 如果需要准确控制对象的binding,可以尝试使用DynamicObject,重写GET、SET方法来满足自己的需要。
以上是个人对Dynamic和DLR的一些认识和学习。欢迎各位童鞋互相探讨。
文章首发站点:www.agilesharp.com IT创业产品互推平台
相关文章推荐
- 深入了解Dynamic & DLR(一)
- 深入了解Dynamic & DLR
- 深入了解FMDB<二>
- 深入了解RPC <一>
- Appcmd&Adsutil.vbs基本用法及深入了解
- 深入了解RPC <二>
- 深入了解FMDB<三>
- DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API
- 深入了解 register_globals
- svg 和vml深入了解(路径path&shape)
- 深入了解"地址对齐"!
- 深入了解FMDB<一>
- Head First HTML & CSS chapter 2 :深入了解超文本
- DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API
- oracle 9i&10G编程艺术-深入了解oracle结构
- Qt学习之路(9):深入了解信号槽
- 慢慢了解慢慢深入熟练掌握
- 深入了解Looper、Handler、Message之间关系
- MySQL master-master replication 深入了解
- 深入了解Java ClassLoader,Bytecode,ASM,Cglib