基于ORM的国产开源框架WebSharp在.Net中的应用

    技术2022-05-11  61

    ORM ORM ,即 Object-Relational Mapping (对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样我们在具体的操作业务对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作对象的属性和方法就可以完成对关系数据表的操作。 使用 ORM 技术数据层完全被隐藏,暴露在程序员面前的只是一些实体类对象,在程序中通过实体类的属性来间接操作数据表中的字段。当然这种操作的转换是由 ORM 框架来完成的,对于程序员来说,只是简单地做了一些 getXXX setXXX 方法就可以完成对关系数据表的操作。程序员不用知道什么时候数据库从 Oracle 移到 DB2 ,或是移到 SQL Server ,也不用知道数据库名是什么,甚至表名是什么,字段是什么,对于他来说这没有关系,更甚至于可以不用知道 SQL 语句,可以不懂数据库的任何知识。只需要在适当的时候,调用实体类的 setXXX getXXX 方法,就可以取得和改变数据表字段的值,对于程序员来说,实体类就是存储信息的实体,对实体类的操作,就是对信息实体的操作。如此一来,设计人员只要把系统框架搭出来,把一些实体类交给程序员去实现业务逻辑即可。这样的结构比程序员调用 JDBC 或者 ADO.NET 去操作数据库要清晰优雅得多。 数据持久层新的解决方案 WebSharp WebSharp 的目标,便是设计一个基于 .Net 通用的应用软件系统框架,以简化基于 .Net 平台的企业应用软件的开发。目前, WebSharp 关注于企业应用软件的以下几个方面: 1 、数据库访问 2 O/R 映射 3 AOP 4 、分布式访问 WebSharp 主要设计思路及涉及的技术: 在数据库访问部分 , 使用了 ADO.Net 和工厂模式;在 ORM 部分,使用了动态代码生成和即时编译,以及对 DataSet 进行了扩展;在 AOP 部分,使用了 Proxy 机制;在 Service Locator 部分,使用的主要技术也是动态代码生成和即时编译。 数据实体的表示 应用软件系统,从本质上来说,是计算机对现实世界的模拟。现实世界中的实体对象,在软件系统中,表现为需要处理的数据。在面向对象的系统中,这是通过 " " " 对象 " 来表示的。参考著名的 "MVC" 模式,系统中需要处理的数据,在面向对象的系统中,属于实体类部分。 WebSharp 在数据的表现上,能够采用两种方式: 第一种方式,充分利用了 .Net Framework 类库中 DataSet 的功能,设计了一个 EntityData 类。这个类继承了 DataSet ,并增加了一些属性和方法。同数据库的映射关系,采用 XML 配置文件的方式。 XML 配置文件可以通过工具来生成。 在实际的应用中,要获取一个 User 实体对象,可以通过如下方式取得: EntityData User = EntityProtypeManager.GetEmptyEntity("User"); 然后,可以通过如下方式来访问这个对象的属性: string UserName = User["UserName"] 可以看到,这种方式同纯粹的面向对象的方式有点不同。在这种方式下,数据的表现形式只有一个,那就是 EntityData 。其好处是明显的,不用为每个实体都单独编写一个类,能够大大减少代码的编写量。其缺点也很明显,那就是不能利用编译器类型检测的功能,如果在调用对象属性的时候,写错了属性的名称,就可能出错,但是这个问题可以通过工具来解决。这种方式,比较符合原来使用 ADO 编程人员的习惯。 第二种方式,我们可以编写一个 User 类,然后,按照标准的 OO 的方法来使用这个类。只不过在编写 User 类的时候,必须实现 PersistenceCapable 接口,并且同时可以使用到 EntityData 类的强大功能。 一个按照这个标准实现的 User 类的简单示例如下: Public class User: PersistenceCapable { private EntityData user; public User(bool AutoInit) { user = EntityPrototypeManager.GetEmptyEntity("User");          if(AutoInit)  user.NewRecord(); }         public string UserName         {             get{return user.GetString("UserName");}             set{ user["UserName"]=value;}         } public string UserSex         {              get{return user.GetString("UserSex");}              set{ user["UserSex"]=value;}         } public string UserBirthday         {               get{return user.GetString("UserBirthday");}               set{user["UserBirthday"]=value;}         }         public int ObjectCount         {             get{return user.EntityCount;}         } public EntityData EntityData         { get {return user; }               set{user=value;}         } public bool Next()         {               return user.Next();         } public void First()         {             user.First();         }         public void AddNew()         {              user.NewRecord();         } } 可以看出,采用这种方式, User 类既可以代表一个单个的 User 对象,也可以包含一个 User 对象集合,并且可以通过 Next First 方法来遍历。 数据的存取方式 数据存取的目的,是持久化保存对象。在 WebSharp 中,定义了 PersistenceManager 接口来实现这个功能。 我们可以使用如下的方式来持久化保存一个对象: User user= new User(true); ……// 处理 user PersistenceManager pm = PersistenceManagerFactory.Instance().CreatePersistenceManager(); pm.PersistNewObject(user); pm.Close(); 这样数据就已经保存到数据库中了,代码非常简明和直观,没有一大堆数据库操纵的代码,也不容易发生差错。 事务处理 在很多时候,在处理对象保存的时候,我们需要使用事务处理,特别是在处理一对多结构对象的时候。在 WebSharp 中,我们可以通过 Transaction 接口来完成这个功能。 下面是使用事务处理的一个例子: User user = new User(true); ……// 处理 user PersistenceManager pm = PersistenceManagerFactory.Instance(). CreatePersistenceManager();         Transaction trans=pm.CurrentTransaction; trans.Begin(); try {     pm.PersistNewObject(user);     trans.Commit(); } catch (Excption e) {     trans.Rollback(); } finally {     pm.Close(); }   对象的查询 WebSharp 提供了对象查询的功能,这个功能通过 Query 接口提供。可以通过下面的办法来使用 Query 接口: PersistenceManager pm = PersistenceManagerFactory.Instance().CreatePersistenceManager(pp); Query q = pm.NewQuery("User"); q.Filter = "UserName=’zyc’"; q.Open(); EntityData entity = q.QueryData(); dataGrid1.DataSource = entity; q.Close(); pm.Close(); 对于执行多表关联的复杂查询情况, WebSharp 并没有封装简单数据实体的处理,因为多表关联映射实体类的方法复杂难以控制, WebSharp 舍弃了对这种情况的 ORM 处理,但是 WebSharp 也提供了直接操纵数据库的数据访问接口—— DataAccess ,这个接口对 ADO.Net 进行了一些封装,可以使程序员更加容易的使用 ADO.Net 的功能,并且能够屏蔽不同数据库之间的差别。 能够通过 PersistenceManager NewDataAccess 方法来初始化一个 DataAccess 对象,然后调用相应的办法来执行需要的功能。 下面是一个简单处理多表关联查询的例子: PersistenceManager pm = PersistenceManagerFactory.Instance().CreatePersistenceManager(); DataAccess da = DataAccessFactory.CreateDataAccess(ApplicationConfiguration.DefaultPersistenceProperty,pm); string strSql = null; strSql = "Select * from Customer a left join CustomerFamliy b on a.CustomerID = b.CustomerID" ; Websharp.Base.QueryParameterCollection qpc = new Websharp.Base.QueryParameterCollection(); DataSet ds = new DataSet(); da.ExecuteDataset(strSql,qpc,ds,"CUSTOMERINFO"); da.Close(); pm.Close(); his.DataGrid1.DataSource = ds.Tables[0]; this.DataGrid1.DataBind();   业务逻辑的处理 有了上面的工作,我们就可以把这些对象组合起来,不再关心数据底层与数据库的操作,而开始专心编写我们的业务逻辑。在面向对象的系统中,业务逻辑表现为对象之间的交互,在一些简单的系统中,没有复杂的业务逻辑,只是一些数据的维护工作,那么,有了上面两个部分的工作,我们实际上可能已经忘成了大部分的工作。在使用 WebSharp 后,对于业务逻辑的编写,可以变成一个非常自然的过程,也能够节省很多代码量。 最简单的业务逻辑: private User getUser() { User user = new User(true); user.UserName = “zyc”; user.UserSex= “ ”; user. UserBirthday = “1980年4月16日”;     return user }   WebSharp 应用系统的配置 1、  缓存的配置 WebSharp 使用了微软的 Cached Application Block 来缓存数据,因此,缓存信息必须在应用程序中添加。关于 Cached Application Block ,可以参见微软的相关文档。 2、  系统持久化配置信息 配置 PersistenceProperty ,对于 Web 应用系统,可以在 Global.asax 中配置,对于 Windows 应用程序,可以在程序初始化时设置。 下面是设置的一个例子: PersistenceProperty pp=new PersistenceProperty(); pp.ConnectionString="server=192.168.1.205;uid=sa;pwd=;database=HDMS;";// 数据库连接字符串 pp.DatabaseType = DatabaseType.MSSQLServer;    // 数据库类型 pp.MapFileLocation = @"/HDMS/Model/XMLDefinition/"; //XML 定义文件的路径 pp.MapFileLocationTye=MapFileLocationType.Assembly;   //XML 文件路径的类型 pp.UserID="sa";            // 数据库用户名,必须与数据库连接字符串中的用户名一致 pp.Password="";          // 数据库用户密码,必须与数据库连接字符串中的用户密码一致 ApplicationConfiguration.DefaultPersistenceProperty=pp; // 设置应用程序的默认配置属性 配置信息的说明如下: 1)  数据库连接字符串、用户名和密码的设置按照常规设置 2)  MapFileLocationTye 指明 XML 映射文件的路径类型,可以有三种类型 : a)       AbsolutePath :采用绝对路径的形式,在这种情况下, MapFileLocation 设置成绝对路径的形式,如:“ d:/HDMS/xml/XMLDefinition ”。 b)       VirtualPath :对于 Web 应用程序,可以设置为虚拟路径的形式,如“ /HDMS/Model/XMLDefinition ”。 Assembly XML 文件作为资源文件被编译。采用这种形式,需要将 XML 文件的生成操作属性设置成“嵌入的资源”,这种情况下, MapFileLocation 的格式为:“ AssemblyName,NameSpace ”。例如, XML 文件位于 HDMS 项目的 xml 文件夹下面, MapFileLocation 可以设置为:“ HDMS, HDMS.xml 小结: ORM (对象关系映射),是基于数据库应用软件系统的重要组成部分,一个结构良好的 ORM 框架,可以给软件系统的开发带来很大的好处,因此,在处理这部分内容的时候,需要我们进行精心的设计。 WebSharp 提供了一个可用的方案,能够方便的简化这方面的开发。 

    最新回复(0)