NBear是一个很不错的dotnet ORM框架,是由国人在cnblog开发维护的一个项目. 有需要使用NbearLite和
sqlite做些工具,NbearLite有Generator只有C#和VB.net两种语言
支持,看了一下Generator的source后决定试试加入Boo的
支持.
效果还可以,但没有完全测试过其他的库,反正
sqlite
生成的tools和C#
内容一样.
分享一下过程: 当然先是需要down一份NBearLite的src了 http://www.nbear.org/ 以下将使用root指代源
文件夹根目录,如下载的NBear压缩包解开后的路径为: C:Documents and SettingsAdministrator桌面NBearLite_v1.0.2.4_src 则root代表上面的完整路径 看看在root有些什么,BSD.license lib readme.txt src 所有的源码都在src这个目录下,而我们需要
修改的是NbearLite这个solution的NBearLite.QueryColumnsGenerator这个project.你需要sharpdevelop(http://www.sharpdevelop.net/OpenSource/SD/Download/),直接到rootsrcNBearLite下打开NBearLite.sln 找找NBearLite.QueryColumnsGenerator这个project,如果顺利的话你应该很容易找到它. 如果你都准备好了,那么我们下面就可以开始对源码进行改写,
增加一些我们需要的
内容. 其实需要改动的
代码量很少,只需要改到Form1.Designer.cs和Form1.cs这两个
文件的少量的
内容就可以了,不过在改源码之前我们还需要做一些操作. 我们得
增加一些references,因为在原来的solution中引用
MysqL和
sqlite的assembly的路径有问题,我这里build的时候有报错,所以我自己手动
增加了对这两个assembly的引用(到rootlib下找). 对着NBearLite.AdditionalDbProviders的References右键->"Add Reference"->".Net Assembly Browser"->"Browse...",在弹出的
文件选择窗口中定位到rootlib目录下,选择
MysqL.Data.dll和System.Data.
sqlite.dll这两个assembly. NBearLite.QueryColumnsGenerator相同的操作. 对着NBearLite.QueryColumnsGenerator右键->"Build",如果没有报出errors那么咱们就可以开始
修改源码了. //
修改Form1.Designer.cs // 239行到241行的
内容,也可以自己find一些关键字,如C#,VB.net // 原来的
内容如下(注:我已经把源码的回车去掉并成一行,只是为了在blog上
显示的简洁一些) // this.outputLanguage.Items.AddRange(new object[] {"C#","VB.NET"}); //
增加我们需要的"Boo"选项 this.outputLanguage.Items.AddRange(new object[] {"C#","VB.NET","Boo"}); // >> 省略部分
代码 << // 定位到295行上 // 原来的code // this.saveFileDialog1.Filter = "C# Code Files*.csVB.NET Code Files*.vb"; // 这里
增加boo的
内容 this.saveFileDialog1.Filter = "C# Code Files*.csVB.NET Code Files*.vbBoo Code Files*.boo"; // 这里或运算符在blogger上显不出来,所以大家仿着原来的code写 这样Form1.Designer.cs就改完了 //
修改Form1.cs // 需要
增加一个Boo的assembly的reference,在boo的bin目录下找"Boo.Lang.CodeDom.dll" // 定位到"private void btnGen_Click(object sender,EventArgs e)"上 // 我们需要
增加自己的provider(这就是为什么我们需要reference上面的assembly了) // 下面是原来的code // if (outputLanguage.SelectedIndex == 0) // provider = new Microsoft.CSharp.CSharpCodeProvider(); // else // provider = new Microsoft.VisualBasic.VBCodeProvider(); // 改动过的code if (outputLanguage.SelectedIndex == 0) provider = new Microsoft.CSharp.CSharpCodeProvider(); else if (outputLanguage.SelectedIndex == 1) provider = new Microsoft.VisualBasic.VBCodeProvider(); else provider = new Boo.Lang.CodeDom.BooCodeProvider(); // >> 省略部分
代码 << //定位到1189行上,在"private void tbPath_Leave(object sender,EventArgs e)" // 同样我们需要在if里
增加我们boo的
内容 // 下面是原来的code // if (tbPath.Text.Trim().Length > 0 && System.IO.Path.GetExtension(tbPath.Text) != ".cs" && System.IO.Path.GetExtension(tbPath.Text) != ".vb") // 下面是改动后的code if (tbPath.Text.Trim().Length > 0 && System.IO.Path.GetExtension(tbPath.Text) != ".cs" && System.IO.Path.GetExtension(tbPath.Text) != ".vb" && System.IO.Path.GetExtension(tbPath.Text) != ".boo") // 1202行 // "private string GetExtension()"这个
方法也
修改少许的
修改 // 下面是原来的code // if (outputLanguage.SelectedValue == "VB.NET") // { // return ".vb"; // } // return ".cs"; //
修改后的code if (outputLanguage.SelectedValue == "VB.NET") { return ".vb"; } else if (outputLanguage.SelectedValue == "C#") { return ".cs"; } return ".boo"; // 这样需要改动的
代码都改完了,再build出project看看
效果 到rootsrcNBearLiteNBearLite.QueryColumnsGeneratorbinRelease下找
生成的
代码还不能直接使用,而且因为存在两个namespace所以compile时会报错,
解决的办法是改动
生成的
代码,如: // 第一步,把从第二行(
包括第二行)以后的code都回缩一个indent // 第二步,去掉第二个namespace,以"__"开关的那个命名空间 // 第三步,ctrl+r调出replace窗口替换所有的"___"(三个下划线)为""(空) // 第四步,ctrl+r调出replace窗口替换所有的"__"(两个下划线)为""(空) // 第五步,
修改TABLENAME字段的声明 // 原来的code // private TABLE_NAME as string //
增加final static,下面是改动过的code private final static TABLE_NAME as string 这样应该就可以了,build试试,是不是不再报错了?很简单不是吗?哈哈. (后来测试发现还是不行,IQueryTable接口里有一个___GetTableName的
方法需要实现,但boo好像不可以使用三个下划线开头做为
方法名,晕,不明白为什么作者会用下划线开头!再想想别的
方法)
原文链接:https://www.f2er.com/vb/262103.html