自己动手写ORM的感受

Posted 云中仙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己动手写ORM的感受相关的知识,希望对你有一定的参考价值。

  之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻。作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM框架的使用能更加轻车熟路。二来也可在写ORM之时熟悉反射的应用场景,反射的优缺点,优化方 法,Lambda表达式,表达式树等。,对自己也是一个不错的锻炼。

   ORM的原理也就表映射,反射,拼接sql,缓存,Lambda进行方法调用。网上有很多源码参考和原理讲解,对着敲一敲完成一个简易的ORM并不是什么很难的事。

自己写之前对反射还算熟悉,所以从表映射,反射,拼接sql一路走来倒也没有什么很难理解的。写完第一个加载表数据的时候,也的确发现了反射用的太 多,太依赖反射,取值,赋值,调用。众所周知,反射是会有一定的性能消耗的,虽然一次使用的影响很小,但关键是量多啊,量变引发质变。

   作为一个程序员,对每一丝可优化的代码有会想要去优化。于是我就去找资料啊,看各位大神的文章啊,看到有人介绍Lambda,有人介绍CodeDom,有 人介绍Emit,这么多选择我该选择什么呢?又是找了一番资料,最后选择了Lambda去优化。选好了优化手段,该去实现了,于是问题出现了,用 Lambda构建表达式树,生成委托,调用,对于一个很少写委托的菜鸟,看着源代码实在难以理解,看了几遍头都痛了。没办法,找资料,补全自己的知识。找 Demo,写例子,一条语句一条语句啃,慢慢的,也就稍微能理解源代码里各个方法,各个语句的作用了,对利用lambda优化的思路也开始清晰了。

   ORM还在写,源码就不放上来了,菜鸟写的菜。ORM的例子,源码,讲解网上的文章不少,自己有兴趣找一下不会很难的。

   下面是我设置属性值的代码,窥一斑而知全豹。

    static Func<T, object, object> GetSetDelegate<T>(MethodInfo methodInfo,Type type)  
           {  
               //设置参数节点  
               var param_obj = Expression.Parameter(typeof(T), "obj");  
               //设置参数节点值  
               var param_val = Expression.Parameter(typeof(object), "val");  
               //转换类型  
               var body_val = Expression.Convert(param_val, type);  
               //表达式方法体  
               var body = Expression.Call(param_obj, methodInfo, body_val);  
               //生成Lambda表达式的委托  
               Action<T, object> set = Expression.Lambda<Action<T, object>>(body,param_obj, param_val).Compile();  
               //返回委托  
               return (instance, v) => { set(instance, v); return null; };  
           }  
      
           static void FastSetValue<T>(this PropertyInfo prop, T t, object val)  
           {  
               //得到属性写方法  
               MethodInfo m = prop.GetSetMethod();  
               //调用方法  
               GetSetDelegate<T>(m, prop.PropertyType)(t, val);  
           }  

菜鸟的理解可能不能入大神们的眼,如果我理解的有错误,或有偏差,还请大神们能不吝指教。

以上是关于自己动手写ORM的感受的主要内容,如果未能解决你的问题,请参考以下文章

自己动手写ORM(02):Sql生成器实现

自己动手写ORM(01):解析表达式树生成Sql碎片

985大学的高材生只会写代码片段,丢人吗?

985高校的高材生只会写代码片段,丢人吗?

985大学的高材生只会写代码片段,丢人吗?

985大学的高材生只会写代码片段,丢人吗?