阿不

不抛弃,不放弃

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  158 随笔 :: 0 文章 :: 2073 评论 :: 66 Trackbacks

上篇中,介绍了使用NBear.Mapping进行实体对象与ADO.NET对象的互转功能,这可能是我们开发过程中最常的一种映射了。除此之外,NBear.Mapping还支持实体对象与NameValueCollection,IDictionary等弱类型的互换转,下面就让我们来看看吧。

NameValueCollection实体对象

当你希望把Request.QueryString的字段赋值到一个对象时,手工写这段代码你可能会觉得浪费时间了。现在如果NBear.Mapping可能帮你完成这个工作,难道你不会接受吗?只要简单的这样一句代码就可以完成你的工作了。

   1: UserObject outputObject = ObjectConvertor.ToObject<UserObject>(nameValue);

因为NameValueCollection的Value类型是字符串的,但是没有关系,NBear.Mapping会自动进行类型转换的。反过来,如果想把实体对象转换为NameValueCollection对象时,仍然是一样的简单:

   1: NameValueCollection outputObject = ObjectConvertor.ToObject<NameValueCollection>(user);

IDictionary与实体对象

NBear.Mapping支持将实体对象转换为实现了IDictionary的对象,比如Dictionary<string,object>,Hashtable。分别用下面没行代码就可以完成这样的转换:

Dictionary<string, object> outputObject = ObjectConvertor.ToObject<Dictionary<string, object>>(user);
Hashtable outputObject = ObjectConvertor.ToObject<Hashtable>(user);

相反的转换:

Dictionary<string, object> dic = ObjectConvertor.ToObject<Dictionary<string, object>>(user);
Hashtable hashTable = ObjectConvertor.ToObject<Hashtable>(user);
接口使用都是一样的,这里就不再嗸诉(有谁能告知一下Ao Shu是哪两个字 :( )。

性能

前面不止一次的说到,NBear.Mapping有比较优的性能。它有比较好的性能是因为它的转换使用的是动态生IL代码来进行转换的,并且生成的IL代码是有缓存的。其实相当于就是动态的手写代码。在NBear.Mapping.Test的MappingTest中,有4个测试TestPerformance1~4就是测试性能的,每一次转换分别执行100000次,随机进行的一次测试结果如下(手写 VS NBearMapping VS 反射 的性能对比,以手写代码为基准):

DataRow 转实体对象:

Test performance of converting 100000 data rows to class objects
Manually Coding vs NBearMapping vs Reflection
8906250 (1)
vs
11718750 (1.31578947368421)
vs
26093750 (2.92982456140351)

实体对象转实体对象

Test performance of converting 100000 class objects to class objects
Manually Coding vs NBearMapping vs Reflection
312500 (1)
vs
2187500 (7)
vs
15625000 (50)

DataReader 转实体对象

Test performance of converting 100000 dataReader to class objects
Manually Coding vs NBearMapping vs Reflection
7812500 (1)
vs
11406250 (1.46)
vs
29531250 (3.78)

NameValueCollection转实体对象

Test performance of converting 100000 namevaluecollections to class objects
Manually Coding vs NBearMapping vs Reflection
5625000 (1)
vs
12812500 (2.27777777777778)
vs
16875000 (3)

到些为止,NBear.Mapping的使用介绍就告一段落了。除此之外,NBear.Mapping还有一些其它功能,比如配置,自定义映射接口,扩展功能等等,这些功能只要你愿意花一些时间很容易就能够掌握了。NBear.Mapping使用其实就是这么简单,它自己本身也是很简单的,只要你愿意尝试,相信它会给你带来意想不到的效果的。

示例下载

阿不

NBear开发团队

阿不 http://hjf1223.cnblogs.com
posted on 2007-12-19 19:56 阿不 阅读(2278) 评论(18)  编辑 收藏 所属分类: NBear

评论

#1楼  2007-12-19 20:03 stonezhu      
呵呵,看好Nbear,加油,下一个项目就用,其实以前已经用NB3开发过完整的项目,觉得不错,但是就是觉得速度好像有点问题,还在找。
前一个也搞过一个小站用了Nbearlite,觉得不错,
下一个项目继续用,打算结合nbearlite和nbear mapping了。支持NBEAR,实给了我很大的方便,以前需要自己去写interface来做数据库的移植,现在用nbearlite就不需要了,支持的数据库还多。喜欢
希望越做越好
  回复  引用  查看    

#2楼  2007-12-19 22:43 Kingthy      
支持.刚从SVN下载了源码.正在看ING..
  回复  引用  查看    

#3楼 [楼主] 2007-12-20 08:36 阿不      
@stonezhu
我不知道你是使用V3的什么版本,如果使用V3.7.2以后的应该不会存在性能问题,特别是查询。
关于V3和NBearlite,NBear mapping的选择,你可以自己决定。如果你要求比较完整的解决方案,可以选择V3,如果你需要灵活,那么你可以选择后者。
  回复  引用  查看    

#4楼 [楼主] 2007-12-20 08:37 阿不      
@Kingthy
欢迎多指意见
  回复  引用  查看    

#5楼  2007-12-20 09:20 初用者 [未注册用户]
请检查:

在 NBear.Mapping.NBearMappingConfiguration..ctor(String fileName) 位置 e:\Open Source\NBear\NBearV4\CNBlogs\trunk\src\NBearMapping\NBear.Mapping\ConfigurationManager.cs:行号 726
在 NBear.Mapping.ConfigurationManager.Init() 位置 e:\Open Source\NBear\NBearV4\CNBlogs\trunk\src\NBearMapping\NBear.Mapping\ConfigurationManager.cs:行号 49
在 NBear.Mapping.ConfigurationManager..cctor() 位置 e:\Open Source\NBear\NBearV4\CNBlogs\trunk\src\NBearMapping\NBear.Mapping\ConfigurationManager.cs:行号 31
--- 内部异常堆栈跟踪的末尾 ---
在 NBear.Mapping.ConfigurationManager.GetObjectMapper(Type inputType, Type outputType, String viewName)
在 NBear.Mapping.ObjectConvertor.GetObjectMapper(Type inputType, Type outputType, Type initType, String viewName) 位置 e:\Open Source\NBear\NBearV4\CNBlogs\trunk\src\NBearMapping\NBear.Mapping\ObjectConvertor.cs:行号 120
  回复  引用    

#6楼 [楼主] 2007-12-20 09:51 阿不      
@ 初用者 [未注册用户]
出现了什么类型的异常呢?
  回复  引用  查看    

#7楼 [楼主] 2007-12-20 09:52 阿不      
@ 初用者 [未注册用户]
你的XML文件是不是有问题啊?不是一个合法的XML文件。
  回复  引用  查看    

#8楼  2007-12-20 09:55 初用者 [未注册用户]
直接运行你的测试用例报的:

测试方法 NBear.Mapping.Case.CaseTest.TestUserToUser 引发异常: System.TypeInitializationException: “NBear.Mapping.ConfigurationManager”的类型初始值设定项引发异常。 ---> System.IO.FileNotFoundException: 未能找到文件“C:\Documents and Settings\XXX\桌面\nbear.mapping.case\NBear.Mapping.Case\TestResults\XXX2007-12-20 09_47_08\Out\Case.config”。。

怎么好像有你的绝对路径?
  回复  引用    

#9楼  2007-12-20 09:56 初用者 [未注册用户]
我是说这样的路径:
e:\Open Source\NBear\NBearV4\CNBlogs\
  回复  引用    

#10楼 [楼主] 2007-12-20 10:37 阿不      
@初用者 [未注册用户]
谢谢你的提醒,你再重新下载一下示例文件。就可以了。
  回复  引用  查看    

#11楼  2007-12-20 10:59 初用者 [未注册用户]
还是问题依旧:(
  回复  引用    

#12楼 [楼主] 2007-12-20 11:06 阿不      
@ 初用者 [未注册用户]
不会吧,我再次下载了。打开运行没有任何错误啊!?你再试试
  回复  引用  查看    

#13楼  2007-12-20 11:21 初用者 [未注册用户]
楼主换个环境试验一下,

或是把你的这个路径临时改个名字试试:e:\Open Source\NBear\NBearV4\CNBlogs\

可能是你绝对路径的问题吧?
  回复  引用    

#14楼 [楼主] 2007-12-20 11:34 阿不      
@初用者 [未注册用户]
不是绝对路径的问题,在测试配置文件里面指定的相对路径。
你再重新下载一下,有可能你没有下载到新版本了。我这边把原来的路径都改名,仍然可以用啊。
  回复  引用  查看    

#15楼  2008-01-23 08:54 搜索人生      
Nbear支持缓存吗?对第三方的缓存支持怎样?方便的话加我MSN聊聊:yaominhua!hotmail.com
  回复  引用  查看    

#16楼 [楼主] 2008-01-23 11:26 阿不      
@搜索人生
NBear本身支持缓存。
  回复  引用  查看    

#17楼  2008-08-02 20:21 忘了 [未注册用户]
这个不含json转换么?
  回复  引用    

#18楼 [楼主] 2008-08-02 21:22 阿不      
@忘了
这个跟JSON没有关系的。
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-23 20:31 编辑过


相关链接: