代码改变世界

随笔分类 -  Code生成技术

Green.AgileMapper新增-Green.ObjectPickUper(do到dto对象的默认抽取)

2012-04-05 23:17 by 破狼, 1671 阅读, 收藏, 编辑
摘要: Green.AgileMapper意在处理领域驱动开发中对象之间的Mapper(如果你还不了解Green.AgileMapper,从这里开始Green.AgileMapper开源项目的使用(1) 和Green.AgileMapper项目(2)-新增DO和DTO代码生成,项目地址:CodePlex http://agilemapper.codeplex.com/),本项目在后期会针对领域建模提供设计时候支持,利用EF和NHibernate作为底层ORM框架产生自己的领域框架,在设计时才会采用这些组件。 在我们的领域驱动开发中,DomainObject(领域对象)是一个自然oo对象,存在许多... 阅读全文

Green.AgileMapper项目(2)-新增DO和DTO代码生成

2012-03-31 20:57 by 破狼, 2036 阅读, 收藏, 编辑
摘要: 如果你还不了解Green.AgileMapper的用意,作用请先一步到上篇Green.AgileMapper开源项目的使用,如果你觉得运行时(Runtime)的Mapper效率存在问题,在这个版本中有了更新,新增了C#直接代码的生成,这里的生成都已3.0后的扩展方法实现,你可以很方便的一句代码实现两者的转化。 代码生成我本想利用T4模板,但是由于我们的项目IDE版本是VS2008,对于T4的参数传递支持还不是很友好,你可能说用AppDomain.SetData,或者CallContext.LogicalSetData,但是可惜我们的饿MappingRule是不可序列化的,所以最后我只得采用了. 阅读全文

Green.AgileMapper开源项目的使用(1)

2012-03-29 13:40 by 破狼, 2762 阅读, 收藏, 编辑
摘要: 在架构设计中,利用领域驱动开发时,涉及到do(领域对象)和dto(数据传输对象)的相互装换匹配,这段代码简单但是重复频率太多,写得我很冒火(我有个职责是wcf SOA包装),我是个不喜欢重复劳动的懒人,我在网上搜索等到很多实体匹配的框架EmitMapper,AutoMapper等,但是他们都不能满足dto和do的对象的按规则匹配包装。最后我只得花了半个小时写了一个简单的代码生成器,完成了我的任务。但是事后总觉得不爽,于是有了写下这个AgileMapper框架来适应领域开发中的po,do,dto,vo着一些列对象的相互包装,建立一个按规则包装的Mapper框架。项目已经完成上传于CodePle. 阅读全文

代码生成技术-目录

2011-08-22 21:34 by 破狼, 4357 阅读, 收藏, 编辑
摘要: 在这里总结的是本博客中的一些关系代码生成的技术,其中包含CodeDom,CodeSmith,T4,Mono.CecilMSIL(静态AOP实例)注入,以及一些杂记。一:CodeDom目录CodeDOM 提供了表示许多常见的源代码元素类型的类型。您可以设计一个生成源代码模型的程序,使用 CodeDOM 元素 构成一个对象图。可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。CodeDOM 也可以用于将 源代码编译成二进制程序集。 CodeDOM 的一些一般用途包括: 模板化代码生成:生成 ASP.NET、XML Web 服务客户端代理、代码向导、设计器或其他代码发. 阅读全文

MSBuild + MSILInect实现编译时AOP-改变前后对比

2011-08-09 23:20 by 破狼, 2838 阅读, 收藏, 编辑
摘要: 实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方法,重新组装成一个方法(并加上[CompilerGenerated]标签),在加入横切注入接口前后代码,调用此方法。比如代码:[TestAOPAttribute(Order=1)]publicClass1TestMethod1(inti,intj,Class1c){Console.WriteLine("ok 阅读全文

MSBuild + MSILInect实现编译时AOP之预览

2011-08-09 14:05 by 破狼, 3331 阅读, 收藏, 编辑
摘要: 在本文之前的前几篇浅谈.NET编译时注入(C#-->IL)、浅谈VS编译自定义编译任务—MSBuild Task(csproject)、编译时MSIL注入--实践Mono Cecil(1)已经讨论了MSBuild和Mono.Cicel。在这里我们将会利用它来实现一个简单的编译时AOP注入机制(这里所说的编译时是指c#到MSIL的预编译过程)。我更倾向于像EL(微软企业库框架)这类动态AOP。编译时AOP有PostSharp这种被称之为静态AOP框架,其优势在于直接代码语句,性能更好,它不需要我们多余的代码,像EL这种动态AOP,一般我们是不能直接new一个对象,需要容器(Containe 阅读全文

编译时MSIL注入--实践Mono Cecil(1)

2011-07-28 21:34 by 破狼, 13119 阅读, 收藏, 编辑
摘要: 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具)。之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInject制作静态注入式AOP,想成熟的产品PostSharp,当然我也不会去重造轮子,但需要明白起原理和 阅读全文

浅谈VS编译自定义编译任务—MSBuild Task(csproject)

2011-07-27 23:17 by 破狼, 15029 阅读, 收藏, 编辑
摘要: 在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入。紧接着在这节,要来看的就是MSBuild Task。在我们的代码预编译过程中我们可以创建我们自己的任务Task。下面我们就开始做一个简单的Task。1:首先需要添加Microsoft.Build.Utilities.v3.5.dll和Microsoft.Build.Framework.dll中引用。在Microsoft.Build.Framework中为我们定义了接口ITask,自定义任务需要去实现这个契约。其定义如下:publicinterfac 阅读全文

浅谈.NET编译时注入(C#-->IL)

2011-07-26 21:27 by 破狼, 11303 阅读, 收藏, 编辑
摘要: .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。1:我们先来看看最简单的var:C#:publicvoidTestVar(){ vari=0; Console.WriteLine(i);}. 阅读全文

代码生成技术--CodeDom VS T4

2010-12-23 12:52 by 破狼, 7140 阅读, 收藏, 编辑
摘要: 在微软的自家代码生成方案中我们有两种选择方式:CodeDom 和Text Template Transformation Toolkit(T4)模板。同样我们可以利用简单的String或者StringBuilder来拼接字符串,但是那对于简单的还可以,但是对于复杂的问题就。其实在ASP.NET MVC 3.0中有多处了一个更简洁语法的模板-Razor,我们同样可以运用于我们自己的代码生成中,我随便有一篇简单的介绍Razor Templating Engine,在以后有机会了会写Razor Demo。今天的主题不在这里,所以不多说了。一:简介:CodeDom:这 个类库出现在我们的.NET Fr 阅读全文

Razor Templating Engine

2010-12-22 12:28 by 破狼, 5711 阅读, 收藏, 编辑
摘要: 最近遇到html模板解析,我完全可以用MS的T4模板或者是StringTemplate等其他的模板来做,但是出于尝试和对Razor语发的感兴趣,便翻了翻Razor模板的资料,其CodePlex主页http://razorengine.codeplex.com/。 下面讲的都是一些其主页上面的例子,所以请大家别拍砖。别后面想到有些实际意义的例子在写个具体的运用例子吧。代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--publicstaticcla 阅读全文

CodeSmith模板引擎系列-目录

2010-09-27 12:40 by 破狼, 3066 阅读, 收藏, 编辑
摘要: CodeSmith是一个基于模板的代码生成器,它可以生成任何基于ASCII的编程语言代码。生成的代码可以使用属性进行定制。属性可以是任何具有设计器的.NET对象(大多数.NET内置类型已经有设计器),也可以是一个允许你从结果中有条件地添加或移除代码的简单的boolean 属性,或是一个对象,例如能够访问数据库表信息的TableSchema对象(包括在SchemaExplorer中)。CodeSmith完全可扩展,它允许用户创建定制属性类型。CodeSmith中包括多个定制属性类型的例子,例如,定制一个允许选择XML文件(使用XmlSerializer可将其反序列化到对象中)的属性类型。Cod. 阅读全文

Dbml文件提取建表TSql-CodeSmith

2010-09-27 12:27 by 破狼, 3298 阅读, 收藏, 编辑
摘要: 在昨天一个大学师弟,他问我能不能将LinqToSql文件转化为创建表的TSql语句,他是刚开始学习.NET,所以在网上下些示例看,但苦于没有数据库。所以就有了这一篇博客,作为我的Code生成技术的CodeSimth的最后一篇示例。在下一步Code 生成技术将转到Microsoft的T4模板,Code生成技术目前完成的有CodeDom,CodeSmith模板,高手请不要拍砖,请直接跳过。 在Linq... 阅读全文

通过代码生成机制实现强类型编程-CodeSimth版

2010-09-25 09:23 by 破狼, 4266 阅读, 收藏, 编辑
摘要: 一直想写一个Code生成系列,但写到CodeSimth,发觉在TerryLee 和努力学习的小熊 两位大牛的博客里讲很详尽,所以就像写些示例方面的,但是苦于没有想到写些什么。最近Artech写了两篇从数据到代码——通过代码生成机制实现强类型编程--上篇和下篇,大牛写得是CodeDom的,今天我就想借借大牛的示例写个CodeSimth版的,希望Artech不要怪我,呵呵。我的... 阅读全文

CodeSmith模板引擎系列二--文件目录树

2010-07-14 11:21 by 破狼, 1667 阅读, 收藏, 编辑
摘要: 今天网上Google了一下,关于CodeSmith的资料已经很全了,其中有TerryLee 和努力学习的小熊 两位大牛的很详尽,所以我也不准备把CodeSmith讲的很细致了,如果是新手学习者可以参考上面两位大牛的CodeSmith文章,CodeSmith的语法与ASP语法接近,语言可以选择我们的c#,所以学习起来很轻松。今天就写一个简单的文件目录树结构的递归模板。Template Code:代码... 阅读全文

CodeSmith模板引擎系列一

2010-07-13 12:12 by 破狼, 6644 阅读, 收藏, 编辑
摘要: 在前些日子写了一些关于CodeDom的代码生成技术(目录),这里先感谢大家的支持和关注。我打算写一些代码生成编译技术的系列,包括CodeDom、CodeSmith模板、T4模板、StringTemplate,以及Expression Tree的系列随笔。如果可能的话再加上Emit系列。在这些系列中希望大家多关注,特别多多指教和交流。好了废话少说,今天就开始写CodeSmith模板。 CodeSmi... 阅读全文

CodeDom系列目录

2010-07-09 12:17 by 破狼, 9910 阅读, 收藏, 编辑
摘要: CodeDOM 提供了表示许多常见的源代码元素类型的类型。您可以设计一个生成源代码模型的程序,使用 CodeDOM 元素 构成一个对象图。可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。CodeDOM 也可以用于将 源代码编译成二进制程序集。 CodeDOM 的一些一般用途包括: 模板化代码生成:生成 ASP.NET、XML Web 服务客户端代理、代码向导、设计器或其他代码发出机制的代码。动态编译:支持以一种或多种语言进行代码编译。经过连续几节的CodeDom系列文章,到今天写的差不多,所以在这里记录下一个索引目录,以便在日后查阅。 CodeDom系列-开篇. 阅读全文

CodeDom六--实体类生成示例

2010-07-08 10:15 by 破狼, 4188 阅读, 收藏, 编辑
摘要: CodeDom这个东西个人觉得知识点不多,前几个续节写的已差不多了。在这节将演示一个CodeDom示例:数据库实体类的生成。这里先声明在如今的CodeSmith或者是T4模板中实现这些都很简单,并且更实用,在这里只是一个CodeDom示例,为了演示CodeDom。 在代码中位了简单、简化数据库数据信息的提取,引用了CodeSimth的SchemaExplorer.dll和SchemaExplore... 阅读全文

CodeDom系列五--动态编译

2010-07-06 09:07 by 破狼, 7367 阅读, 收藏, 编辑
摘要: 继上节我们把Code 表达式编译成为了Code代码,有时我们只想动态编译程序集,在内存中或者是硬盘上调用,这就是CodeDom的动态编译。微软在CodeDom中提供了动态编译程序,这是ICodeCompiler的用武之地了,它定义用于调用源代码编译的接口或使用指定编译器的 CodeDOM 树。可以从CodeDomProvider生成引用对象:CodeDomProvider.CreateProvid... 阅读全文

CodeDom系列四--Code生成

2010-07-05 09:19 by 破狼, 5634 阅读, 收藏, 编辑
摘要:       我们利用CodeDom技术生成了一些列Codedom Expression ,接下来的任务就是编译和生成,生成c#、Vb或者是.NET平台支持语言,编译程序集(dll或者是exe)。       CodeDomProvider:在2.0后提供了CodeDomProvider.Create... 阅读全文