三层架构和ORM问题!!

aspnet30 2009-06-08 02:57:59
ORM用Linq还是用Entity Data Model

用了ORM,三层该怎么架?DAL和BLL和IDAL都不要了?如果要,该怎么写?具体点?
...全文
444 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
windstore 2009-06-10
  • 打赏
  • 举报
回复
ORM和三层有什么关系啊 。MARK..
mail_ricklee 2009-06-09
  • 打赏
  • 举报
回复
可以参考FortuneBase中的IBatisNet
www.cnblogs.com/mail-ricklee
a121984376 2009-06-09
  • 打赏
  • 举报
回复
1用ado.net entities

2 ORM让我们专注业务,而不用管底层的数据是什么
已经为我们封装了对数据库的操作,为什么还要硬区别出来IDAL 和DAL??
你这不是为了分层而分层么???


jiejie526 2009-06-09
  • 打赏
  • 举报
回复
我也来晒晒我的ORM框架
  很多开源的ORM框架都需要配置,那实在是件很烦人的事情。我以前曾打算学NHibernate,开始还以为.NET的Hibernate应该没JAVA的Hibernate用起来麻烦,结果在网上看了些教材,发觉那是一样的麻烦。说实话,只要是要配置的,我都没心情去做。一般的开源ORM框架都比较重量级的,虽然能满足我的需要,但功能实在是太多太复杂了,我压根儿很难用得上,而且用起来也麻烦,我还不如自己直接写代码来得快呢。我总结了一下平时做的项目,大部分的时候我只需要增、删、改、查这几个基本的功能就行了,其它的什么关联啊什么的,用得很少很少。想来想去,还是自己写个简单易用的ORM框架吧,满足一般的需求就够了。

  许多ORM框架把许多代码都用在了配置和其它一些无用功的方面,这样做虽然更加的具有通用性,但同时也给使用者带来了许多麻烦的工作和性能上的损耗,而且体积也变得很大,代码复杂,难以维护。其实这部分的功能根本就没多大的用处,程序员又不是傻子,何必搞那么多的配置来纠错呢。根据约定优于配置的原则,制定一个规范,只要大家都按照约定的规则来使用就OK了,对于程序员来说,要做到这一点一点也不难。

  我的ORM框架的约定是:

  1,实体类名和数据表名相同。

  2,主键是"表名ID",并且主键是自增的整数。

  3,数据表的字段名和属性名相同。

  4,正确使用。

  只要遵循以上的约定,就可以正确的使用我的ORM框架了。

  创建表的ORM管理:

Code//创建UserInfo表的管理者,DbConnectionString是数据库连接字符串名,在配置文件中设置IORMManager<UserInfo> manager = ORMBuilder<UserInfo>.GetORMManager("DbConnectionString");
有了IORMManager,就可以执行数据操作了。



要进行条件查询也很简单,通过IORMManager创建过滤器就行了

Code///创建过滤器 IFilter filter = manager.CreateFilter("UserName", userName, Operator.Equal); UserInfo userInfo = manager.LoadOne(filter);
复合查询可以通过创建BooleanFilter对多个IFilter进行逻辑合并

CodeIFilter bFilter=manager.CreateBooleanFilter(leftFilter,rightFilter,LogicOperator.And);
经常会用到的一个比较复杂的查询应该就是分页功能了吧,我的ORM框架对分页也有很好的支持

Code ///创建分页器 IPager<Products> pager = manager.GetPager(); /// <summary> /// 返回第page页的记录 /// </summary> /// <param name="page"></param> /// <returns></returns> public List<Products> GetProducts(int page) { return pager.Load(page); } /// <summary> /// 返回总页数 /// </summary> /// <returns></returns> public int PageCount() { return pager.PageCount; }
为数据表写实体类是件很麻烦的事情,尤其是字段特别多的时候,这种苦力活不应该由我们来做啊,太浪费了,所以我写了一个自动生成实体类的小软件,偷懒一下。

EntityBuilder.rar 数据表实体类生成工具。

WebSite1.rar 这个是ORM框架的Demo,不小心把罗斯文数据库也打包进去了。

喜欢的朋友看一下吧。



看了这个手就知道ORM框架和三层没多大关系
十八道胡同 2009-06-08
  • 打赏
  • 举报
回复
来学习的
lsd123 2009-06-08
  • 打赏
  • 举报
回复
.
hzj170 2009-06-08
  • 打赏
  • 举报
回复
楼上都很厉害,学习到了。。
mengxj85 2009-06-08
  • 打赏
  • 举报
回复
学习
kirinboy 2009-06-08
  • 打赏
  • 举报
回复
1.不管用什么样的ORM框架,熟悉业务、明确需求才是做好项目的根本。
2.谁说没有DAL、BLL、IDAL就不是多层架构了?
3.千万不要看PetShop,那只是个示例,不是个标准,更不是最佳实践。研究PetShop只会将你带入误区。

没有标准的放之四海皆准的架构,架构的设计时根据业务需求来的!
Ricercar 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 aspnet30 的回复:]
引用 22 楼 Ricercar 的回复:
引用 21 楼 bieqing 的回复:
回复18楼 接口或者抽象类就是为了 解耦和扩展的,你的项目中如果这块需求是固定的,永远不变化。那完全没必要,写借口
这是建立在需求分析的基础上。还有你的项目比较小,改写代码也容易,也可以不写啊。根据需求变化来考虑啊


你没有回答的我的问题



我来回答你的问题吧

1,load类加上参数(比如枚举类型的SelType),获取哪种类型的订单,实现这个…
[/Quote]

但是感觉,这样的话业务逻辑做到DAL里面去了
Ricercar 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 aspnet30 的回复:]
引用 22 楼 Ricercar 的回复:
引用 21 楼 bieqing 的回复:
回复18楼 接口或者抽象类就是为了 解耦和扩展的,你的项目中如果这块需求是固定的,永远不变化。那完全没必要,写借口
这是建立在需求分析的基础上。还有你的项目比较小,改写代码也容易,也可以不写啊。根据需求变化来考虑啊


你没有回答的我的问题



我来回答你的问题吧

1,load类加上参数(比如枚举类型的SelType),获取哪种类型的订单,实现这个…
[/Quote]

有道理
chen_ya_ping 2009-06-08
  • 打赏
  • 举报
回复
ORM用Entity Data Model
看看PetShop对你的帮助会很大

aspnet30 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 Ricercar 的回复:]
引用 21 楼 bieqing 的回复:
回复18楼 接口或者抽象类就是为了 解耦和扩展的,你的项目中如果这块需求是固定的,永远不变化。那完全没必要,写借口
这是建立在需求分析的基础上。还有你的项目比较小,改写代码也容易,也可以不写啊。根据需求变化来考虑啊



你没有回答的我的问题
[/Quote]

我来回答你的问题吧

1,load类加上参数(比如枚举类型的SelType),获取哪种类型的订单,实现这个接口的时候根据不同的SelType获取不同的订单
2,重载或重写一个类
  • 打赏
  • 举报
回复
AdoEF和DLinq具体哪个好啥的没研究过。
不过据说是大项目用EF,小项目用Linq。
  • 打赏
  • 举报
回复
你说的三层是物理分层。

ORM底层数据库操作封装了,可以逻辑分层。
你的界面显示是一层,UI层
业务是一层,Service层
从ORM里取得数据的也做一层。

前者更多关注数据库,后者关注的是业务对象。
Ricercar 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bieqing 的回复:]
回复18楼 接口或者抽象类就是为了 解耦和扩展的,你的项目中如果这块需求是固定的,永远不变化。那完全没必要,写借口
这是建立在需求分析的基础上。还有你的项目比较小,改写代码也容易,也可以不写啊。根据需求变化来考虑啊
[/Quote]

你没有回答的我的问题
bieqing 2009-06-08
  • 打赏
  • 举报
回复
回复18楼 接口或者抽象类就是为了 解耦和扩展的,你的项目中如果这块需求是固定的,永远不变化。那完全没必要,写借口
这是建立在需求分析的基础上。还有你的项目比较小,改写代码也容易,也可以不写啊。根据需求变化来考虑啊


kldx5092 2009-06-08
  • 打赏
  • 举报
回复
nhibernate也不错
hangang7403 2009-06-08
  • 打赏
  • 举报
回复
up
Ricercar 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bieqing 的回复:]
面向对象设计的原则,单一职责,依赖倒置,开放封闭

你理解下,就知道为什么要写接口或者抽象类了
[/Quote]

问你一个问题,有一个IDAL接口,接口定义了一个load方法,有一个订单DAL类,OrderDAL实现了IDAL接口,load方法从数据库中获取订单信息,返回一个订单实体,IList<Order>
现在我要返回三十天内的订单,用哪种方法?
1、调用load方法,然后再从所有的订单中过滤(严重效率问题)
2、在OrderDAL中重载load方法(显然IDAL不知道重载方法,接口已经失去他的作用)
3、在OrderDAL类中添加load30方法(IDAL也不知道load30方法)
4、定义一个Order30DAL类来表读取30天内的订单(IDAL继续有效,但是大大增加代码量)
5、还有别的方法?请赐教?
加载更多回复(17)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧