几个开源项目实体层实现方式比较

原创 2004年10月08日 20:42:00

本文首发于博客园几个开源项目实体层实现方式比较
最近在看duwamish7,asp.net forums, dottext几个优秀的开源(微软官方)的项目
因我目前所处的技术水平的阶段的原因,我看这些项目程序,更加关注的是具体的实现
次之才是架构
我首先关注的是这个三个项目的实体层的实现方式,下面用简单的代码来比较几个项目
的不同实现方式,而后会做一些简单比较,限于个人水平有限,不能做深入的分析,还
请各位大虾点评一二!

实现代码:
一,asp.net forums :
实体类的实现:

None.gif    public class User
ExpandedBlockStart.gif    
{
InBlock.gif        
private string _userName = string
.Empty ;
InBlock.gif        
private string _userPassword = string
.Empty ;
InBlock.gif
InBlock.gif        
public string
 UserName 
ExpandedSubBlockStart.gif        
{
ExpandedSubBlockStart.gif            
get return _userName ; }

ExpandedSubBlockStart.gif            
set { _userName = value ; }
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string UserPassword
ExpandedSubBlockStart.gif        
{
ExpandedSubBlockStart.gif            
get return _userPassword ; }

ExpandedSubBlockStart.gif            
set { _userPassword = value ; }
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

集合类的实现:
None.gif    public class UserCollection : ArrayList
ExpandedBlockStart.gif    
{
ExpandedSubBlockStart.gif        
public UserCollectionOfArrayList() : base() {}

ExpandedSubBlockStart.gif        
public UserCollectionOfArrayList(ICollection c) : base(c) {}
ExpandedBlockEnd.gif    }

二,dottext :
实体类的实现:基本同上,主要差别在于集合类的实现上
集合类的实现:
None.gif    public class UserCollection : CollectionBase
ExpandedBlockStart.gif    
{
InBlock.gif        
public int
 Add(User value) 
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return this
.List.Add(value);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public bool Contains(User value) 
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return this
.List.Contains(value);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public int IndexOf(User value) 
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return this
.List.IndexOf(value);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        
public void Insert(int index, User value)    
ExpandedSubBlockStart.gif        
{
InBlock.gif            List.Insert(index, value);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        
public void Remove(User value) 
ExpandedSubBlockStart.gif        
{
InBlock.gif            List.Remove(value);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
//        public new KeyWordCollectionEnumerator GetEnumerator()    
InBlock.gif
//
        {
InBlock.gif
//
            return new KeyWordCollectionEnumerator(this);
InBlock.gif
//
        }
InBlock.gif
//

InBlock.gif
//        public class KeyWordCollectionEnumerator : IEnumerator    
InBlock.gif
//
        {
InBlock.gif
//            //
这个类是用来迭代类集合用,比如需要使用foreach遍历集合时需要实现此接口,在此处省列
InBlock.gif
//            //
具体实现可以参考dottext的实现方式
InBlock.gif
//        }

ExpandedBlockEnd.gif
    }

三,duwamish7
这个项目是微软官方发布的,所以实体层的实现都是使用微软所推耸的ADO.NET技术
实体类和集合类是在一块实现的:
None.gif    public class UserCollection : DataSet
ExpandedBlockStart.gif    
{
InBlock.gif        
public
 UserCollectionOfDataSet()
ExpandedSubBlockStart.gif        
{
InBlock.gif            
this
.BuildDataTables() ;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
private void BuildDataTables()
ExpandedSubBlockStart.gif        
{
InBlock.gif            DataTable table   
= new DataTable("UserCollection"
);
InBlock.gif            DataColumnCollection columns 
=
 table.Columns;
InBlock.gif            
InBlock.gif            columns.Add(
"UserName"typeof
(System.String));
InBlock.gif            columns.Add(
"UserPassword"typeof
(System.String));
InBlock.gif
InBlock.gif            
this
.Tables.Add(table);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

简单分析 :
一,asp.net forums实体类没有什么好说的,主要是集合类是通过继承ArrayList来实现
集合类,这种实现方法是最简单快捷,但在性能会有一些损失,因为在使用该集合的时候,
需要不断的进行装箱(boxing)和拆箱(unboxing)的操作;

二,dottext实体类和asp.net forums基本上是一样的,但集合类是通过实现CollectionBase
来达到的,实现起来比较复杂和需要更多的代码量,但其实现的集合类是强类型的对象
在使用的时候并不需要进行装箱(boxing)和拆箱(unboxing)的操作,所以在性能上比
asp.net forums的实现方式优

三,duwamish7是使用类型化的DataSet来实现实体层,通常使用DataSet是很耗资源,
一般认为,小数据量的时候使用Collection会性能较优,大数据量使用DataSet性能较
优,但是很多时候,我们在做应用程序的时候,都是从数据库读取数据,一般都会在
存储过程中进行分页查询,只选取部分数据,可以说是小数据量了,如果仅仅从性能的
角度来做选择,个人倾向是类型化的DataSet不是最好的选择

三层架构之实体层以及外观

昨天,七期师兄师姐们给我们讲解了一下三层和三范式。          关于三层:          对于三层的理解,一直在一步步的加深之中,不论理解的对与错,至少现在和别人说三层,能说出一点点的皮...
  • jianxin1009
  • jianxin1009
  • 2012年03月04日 11:20
  • 2424

关于三层架构 = 门面模式/外观模式

“三层结构”是什么?   “三层结构”一词中的“三层”是指:“表现层”、“中间业务层”、“数据访问层”。其中: n           表 现 层:位于最外层(最上层),离用户最近。用于显示数据和...
  • li_yaya
  • li_yaya
  • 2012年03月23日 15:47
  • 552

传入Map返回实体

public static Object getObject(Map map,Object obj){  try{  if(!map.isEmpty()){ for(String str:map.ke...
  • u010724777
  • u010724777
  • 2016年08月02日 16:51
  • 115

三层结构:实体层

实体层类: Imports System.DataImports System.Data.SqlClientImports Global_utility Public Class DataBaseOp...
  • viewercq
  • viewercq
  • 2004年06月23日 17:16
  • 668

实体层示例

/* *制作人:蔺宜忠 *创建时间:2010-3-14-17-35 *说明:新闻回复实体类 *说明2:用于学习 */using System;using System.Collections.Gene...
  • linyizhong001
  • linyizhong001
  • 2010年04月15日 19:51
  • 173

hibernate实体层设计

 hibernate中支持3种类型的继承形式-        Table per concrete class表与子类中的一对一关系-        Table per subclass每个子类对应一...
  • yuyulover
  • yuyulover
  • 2009年11月10日 17:24
  • 430

Models--自动生成实体层代码

///??:jiedamu///??:///??:???using System;using System.Data.Common;using System.Collections.Generic;u...
  • jiedamu
  • jiedamu
  • 2010年04月09日 21:45
  • 497

Shell 脚本案例实战 [4]

for循环结构   for 循环结构语句     1.for循环结构: 语法: for 变量名 in 变量取值列表 do     指令… done   提示:在此结构中“in 变量取值列表”可省...
  • linuxlsq
  • linuxlsq
  • 2016年09月23日 08:54
  • 838

最佳开源应用程序:项目管理软件

在前面一系列文章中,我们介绍了一些开源的CAD软件,BI商业智能软件、视频处理软件和IDE等,本文将介绍几款开源项目管理工具,喜欢可以搜藏! Gantt Project GanntProjec...
  • stefan520
  • stefan520
  • 2013年12月06日 11:03
  • 1320

用EA生成实体层代码

在个人版机房重构中,实体层的代码敲得有点儿烦了。不同的实体只是命名不同,代码结构完全一样。遇到重复的事情,就该动动脑,想想办法了。下面给大家介绍使用EA生成实体层的代码。       首先,建一个类...
  • CYL_happygirl
  • CYL_happygirl
  • 2014年07月22日 20:50
  • 1087
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:几个开源项目实体层实现方式比较
举报原因:
原因补充:

(最多只允许输入30个字)