当前位置:编程学习 > C#/ASP.NET >>

关于ORM框架设计的问题

--------------------编程问答-------------------- 你的GetValue 底层是用DataReader实现的么? 可以考虑根据预先定义的Model,对应调用GetInt这样的方法。
不过我觉得从DB到内存,这样的损失不可避免。 --------------------编程问答-------------------- 这里每个月都有人想做ORM。 --------------------编程问答-------------------- 是使用DataReader,现在虽然也使用了GetInt等等,但还是避免不了装箱 --------------------编程问答-------------------- 目前还没有使用依赖属性这样的做法,不知道可行不 --------------------编程问答-------------------- 我在EntityObject内使用了一个Dictionary<string, object>来保存属性的值,能否使用其他方法改进一下 --------------------编程问答--------------------
引用 1 楼 fangxinggood 的回复:
你的GetValue 底层是用DataReader实现的么? 可以考虑根据预先定义的Model,对应调用GetInt这样的方法。
不过我觉得从DB到内存,这样的损失不可避免。

赞成这种方式 --------------------编程问答-------------------- 到是尝试过使用GetValue<T>这样的方法,但是无法将 int类型转换为 T --------------------编程问答-------------------- 不是有现成的吗? --------------------编程问答-------------------- 毕竟现成的东西也有一些局限性,希望有一些个性化的东西在里面 --------------------编程问答-------------------- 可以试试Xqk.Data数据框架,支持反射、接口、自定义等多种方式建立数据表与实体类的映射,使用方便,灵活。 --------------------编程问答-------------------- public sealed class Product
密封类可以提高变压器的优化。
还有性能什么的,如果反射确实稍微差点,动态编译还是可以的。
你可以先反射做,等性能不够了,再动态编译,Emit语法太复杂,每天只能写出1点点。调试也不方便 --------------------编程问答-------------------- 反射要重复多少次?对于一个类型,反射一次就够了,以后就缓存起来了。比你自定义一堆复杂的结构清爽多了,而且性能只会更好不会更坏。

另外对于大量使用的方法调用,反射之后直接缓存生成的Delegate而不仅仅是MethodInfo,性能也会有进一步提高。 --------------------编程问答--------------------
引用 3 楼 faib920 的回复:
是使用DataReader,现在虽然也使用了GetInt等等,但还是避免不了装箱


你的SqlHelper可以这样写,例如:
public static IEnumerable<T> ExecuteQuery<T>(string sql, DbParameter[] ps, Func<DbDataReader, T> proc)
{
    using (DbConnection con = GetConnection(s))
    {
        var cmd = con.CreateCommand();
        cmd.CommandText = sql;
        if (ps != null)
            cmd.Parameters.AddRange(ps);
        var reader = cmd.ExecuteReader();
        while (reader.Read())
            yield return proc(reader);
    }
}

这只是个例子而已。那么调用它的BLL层中的代码就可以写:
List<TestType> lst = ExecuteQuery("select * from abc", null, rd =>
{
    return new TestType
    {
        Field1 = (string)rd["姓名"],
        Field2 = (DateTime)rd["服药时间"],
        Field3 = (int)rd["剂量"]
    };
}).ToArray();
这类代码。这无需反射,是在编译期就设计好了的。而且你设计SqlHelper的时候丝毫不用假设随后定义的TestType等类型,使用Delegate机制完全可以达到依赖倒置的设计,用不着纠结反射这种低效的开发方法。 --------------------编程问答-------------------- GetConnection(s)  这里多写了一个字符“s"。

实际中这当然是一个工厂方法,返回任意一种DbConnection 子类对象实例。这样当你切换不同的关系数据库,切换这个工厂方法(可能就是修改配置文件),切换保存有sql语句的资源文件,也就可以了。 --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
这里每个月都有人想做ORM。


呵呵,O(∩_∩)O~。

重复的轮子已经不胜枚举~如果真的有兴趣和绝对的决心,不如开源化,做一个可以安装在布加迪上的轮子

从学习角度来讲和初级应用角度来讲,针对个人利益来说,或许还有一定的价值吧~ --------------------编程问答-------------------- --------------------编程问答-------------------- 现在基本上已经完成了,只是提供的一个实体树持久化类还有一些问题

我现在是使用编码00010001,000100010002的方式进行树结构的定义,目前已经完成了插入、删除,但是移动时对编码的处理比较复杂,不知道有没有大虾在这方面有现成的实例 --------------------编程问答-------------------- --------------------编程问答-------------------- 干嘛要自己写?
自己写没别人开源的好!
去看下别人开源的直接来用就行了!
IBatis + spring
.NET版的! --------------------编程问答-------------------- 1:通过反射读取到的框架信息可以在程序中保存下来,反复使用可以降低“边际成本”;
2:如果性能要求苛刻,ORM的引入似乎不是一个好的选择(大量实体的创建和访问一定会带来时间和空间上的损耗);
3:如果真要做,至少需要再做一个工具,根据数据库表结构自动生成实体类定义文件;
4:使用自定义属性+反射的方式,可以做的自定义属性中无非包括:列名称,类型,假名,是否为主键,主键类型等信息。
--------------------编程问答-------------------- 看过一个10年以上开发经验的牛人的博客,说他体会最深的几点中,有一点就是尽量不用orm --------------------编程问答--------------------
引用 21 楼 hzzasdf 的回复:
看过一个10年以上开发经验的牛人的博客,说他体会最深的几点中,有一点就是尽量不用orm


项目不同体会不同,看工程具体要求吧。 --------------------编程问答-------------------- CodePlex上面有很多开源的ORM例子,博客园也有很多开源ORM,找找去,积累经验也好,不过还是不要重复造轮子。我用的是博客园大石头的 Xcoder,还不错,推荐下,呵呵,也开源 --------------------编程问答-------------------- 本人想做一个.Net ORM框架和工具。
开发背景:
1.现在很多大公司还采用.Net2.0环境,不支持Linq O/M
2.优秀框架NH+Spring.Net配置过于复杂,无代码工具
3.其他的框架支持得不够好,而且使用了大量的反射机制。
4.部分开源框架不支持ORM表达式。

开发目的:
1.集成开源框架的优点,快速开发。提高开发效率,系统性能。
2.组建个人工作室和开发团队。提高个人资质。发布开源网站。
3.承接系统开发。

我想要的ORM功能:
1.支持.Net2.0或以上版本。
2.支持Orcle,SqlServer,Access,MySql。其他的以后再考虑。
3.不使用反射机制,或者少用反射。
4.支持基本查询,删除,更新,表达式,通用分页查询,分组查询,部分函数。
5.少量配置文件的支持(仅仅支持配置SQL语句。也就是Ibeatis的支持)。
6.支持事物管理。分为:数据库事物,分布式事物(不需要任何配置)。
7.支持多数据库的分布式。
8.系统操作日志的统一处理。(异步日志)。
9.ORM工具。


说明:以上功能基本上已经有已个雏形了。想目前是基于SQLServer来做的。
已经实现如下功能:
支持基本查询,删除,更新,表达式,通用分页查询,分组查询,部分函数。
支持数据库事物,分布式事物,分布式数据库。
支持SQLServer数据库。
支持异步统一日志管理
本人慎重申明:此贴并非广告。
但是想大家给点参考意见。说说框架能否给我的团队或个人带来经济效益或资质效益。
今晚上准备贴点代码上来。 --------------------编程问答-------------------- 自己做ORM主要是学习先进的设计思想 --------------------编程问答-------------------- 个人看法是反射是需要的,或者说是必须的。做框架就是要把封装做好,不用反射代码会比较丑陋。我做过一个ORM框架,最早几个版本都没有用反射,最后还是改为反射了。至于反射的性能么,应该是有开销的,但是反射也有高性能的作法,性能上的损失是完全可以接受的。另外就ORM框的设计,可以参考这里:
http://blog.csdn.net/binarytreeex/article/details/7867375

如果愿意随时可以交流。 --------------------编程问答-------------------- 可以参照一下 StructureMap的思想  --------------------编程问答-------------------- 可以有这样试试:
1.为每个Table定义一个元数据信息体:tbMeta
2.定义抽象的baseTable,实现数据CRUD操作,和索引器indexer,和对象数据存储
3.每个具体的表,定义一个类,ModelTable 继承 baseTable
以上代码可以通过自定义的工具实现....

使用时:objectTable =new ModelTable ()

--------------------编程问答-------------------- objectTable[tbMeta.fieldName]=xxxx;
....
objectTable.Save()//CRUD命令。


问题是:没有解决object 之间有关联问题。 --------------------编程问答-------------------- 好处是:实现自定义的ORM,想怎么弄都行。 --------------------编程问答--------------------  和Linq的原理差不多  都是对象映射,
 不用再去写那么多sql语句了,防止了sql注入了   --------------------编程问答-------------------- 范型+EMIT 基本是最佳方案了

反射并发小的项目可以考虑,并发大 直接扔掉吧,EMIT可以完全替代的

另外DataTable(Reader) - > 实体,已经有人用EMIT实现过了,性能极好,范型绑定。
具体 http://nlite.codeplex.com/ 写的非常清楚,性能也有详细测试结果。 --------------------编程问答-------------------- 菜鸟路过 --------------------编程问答-------------------- 我就想说一个项目做下来,有几个是没事换着数据库玩的??但大家都在搞什么支持N多数据库,随时切换数据库呢
? --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
这里每个月都有人想做ORM。
偶表示曾经也做过ORM
但是放弃了微软技术人员说不能自定义关键字 而后我就放弃了 --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
这里每个月都有人想做ORM。

我最初的想法是把from u in objs select u;
变成select all from objs;
这种方式 --------------------编程问答-------------------- 关键是有了entity framework, 你这个做给谁用,还是纯粹练手?
ORM,我看来在他的设计UI用反射,他生成的类还是别用反射的好。
补充:.NET技术 ,  分析与设计
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,