.net项目的二次开发解决方案

公司原来项目的二次开发方式主要使用SQL,基本上也能满足客户的要求,优点是使用简单,只要熟悉SQL语句就可以操作,缺点是受限制太多,需要对数据库底层相当的了解,使用时容易出错,无法直接调用业务层代码等,研究了一下.net的动态编译,感觉用它来做二次开发效果应该不错的。
首先我们先做个demo来解释一下动态编译,下面这段代码的意思就是先组织一个源码字符串,然后编译执行。

 

动态编译简单代码

 

了解了上面这段代码,我们基本对动态编译的概念清楚了,但是如果在项目中这样使用的话,我们要自己去控制源代码的全部文档内容,如果大规模应用的话会非常的麻烦,需要重复编写命名空间构造,类构造,函数构造等,如果我们还想看到一个格式良好的源码,我们还必须自己控制格式。现在我们来介绍一种源码构造方式来解决这些问题,请看如下代码:

 

动态编译简单代码改进

 

执行结果如下:


大家了解了动态编译之后,我们这里介绍一个稍微复杂一点的应用:
需求:我们先预定义一个执行流程,而具体执行代码可以在我们项目部署之后再编写。比如说工资的计算在不同应用中算法会有很大的不同。
我们首先定义一个数据库中的数据结构:

 

然后将这个表拖入到dbml(生成的dbml文件请下载源码)文件中,现在我们就开始编写相应的代码吧:
首先我们先来处理函数的参数,如果我们只是将参数列表的字符串存入数据库中的话,我们还要根据格式序列化和反序列化这个参数,所以我们使用

xml存入sqlserver2005中,格式如下

参数格式

为了方便起见我们在这里定义一个FunctionScript的分布类来处理参数问题

 

参数处理

 

然后我们需要一个代码构造类,用于根据情况构造代码:

 

代码构造类

 

下面我们再编写一个用于编译的类:

 

编译类

 

我们再构造一个用于执行的类:

执行类

 

主函数代码如下:

 

主程序

 

运行结果如下

这里边工作的四个对象的时序图如下:

源码下载

在项目中应用可以结合http://www.cnblogs.com/nuaalfm/archive/2008/09/08/1286640.html中的插件编程

posted @ 2008-11-14 11:18 Lance.Liang 阅读(2307) 评论(12)  编辑 收藏 网摘 所属分类: C#

  回复  引用  查看    
#1楼 2008-11-14 11:36 | 侯垒      
很好,支持.
  回复  引用  查看    
#2楼 2008-11-14 11:38 | 金色海洋(jyk)      
没看明白,有什么用处呢?
  回复  引用  查看    
#3楼 [楼主]2008-11-14 11:47 | Lance.Liang      
@金色海洋(jyk)
项目部署之后,有一些需求需要定制,我们又不好拿回来开发,比方说工资计算中有的客户可能有这样的需求,开发部要按时上下班,如果迟到早退会被扣工资,而销售部则不用按照打卡来计算工资等,这些琐碎的东西不可能在开发期都想到,所以可能需要留一个接口给部署人员,如果部署人员可以适当的写程序那么就可以在不影响我们产品发展的情况下帮助客户定制需求。
  回复  引用  查看    
#4楼 2008-11-14 11:57 | 横刀天笑      
这些地方可以用脚本配置,对于业务比较动态的,尝试一下微软的DLR
  回复  引用  查看    
#5楼 [楼主]2008-11-14 12:03 | Lance.Liang      
@横刀天笑
恩,有空研究下DLR
  回复  引用  查看    
#6楼 2008-11-14 13:00 | Clark Zheng      
嗯,World Win就是利用动态编译使C#做角本的,另外还有一个是开源的WOW私服模拟器芒果,好象也是用的这种技术,呵呵
  回复  引用  查看    
#7楼 2008-11-14 13:16 | JimHappy#真嗨皮#郑海滨      
呵呵,我现在也是用户自定义公式,

不过在网站上load的动态assembly不能unload,如果appdoaim来unload的话
又取不到methodinfo来帮用户执行公式;
搞得现在每天凌晨3点卸载httpapplication

  回复  引用  查看    
#8楼 2008-11-14 13:49 | 玄魂      
似乎很牛
  回复  引用  查看    
#9楼 2008-11-14 16:11 | 韦恩卑鄙      
恩 xbox360的media center扩展 transcode 360也用了类似的技术 很可能重写的部分用了一个.cs文件解决

我当时还很费解来的 lz替我找到了答案
  回复  引用  查看    
#10楼 2008-11-14 16:24 | 横刀天笑      
C# 4.0里Compiler可以做为一个Service了,实现这样的代码就更容易了
  回复  引用    
#11楼 2008-11-14 17:42 | what is? [未注册用户]
www.codeproject.com上有许多这样的例子。


有以下有4个不同的示例开源源码,
SnippetCompiler_3.0.2.zip/
evaluatorExample.zip/
DynamicCompileAndRun_src.zip/
DotNetScriptSource.zip

找我要行 aspx#hotmail.com,哈
  回复  引用  查看    
#12楼 2009-01-01 11:01 | 个人知识管理      
此问题的解决方法不是这样的,这是错误的方向。应使用规则引擎!

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-11-14 11:31 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: