5.抽象的数据访问层(Abstract DAL) 1) 先说一下几个接口(interface)EastASP.Enterprise.Objects.IObjectStoreProvider 此接口实现对象的Create, Update 和Delete操作。Eastasp.Enterprise.Objects.IObjectListProvider 此接口实现对象的Retrieve操作,在Snake.Net中,每个对象都需要一个唯一标识,根据这个唯一标识不但可以获取单个的对象实例,也可以通过IObjectListProvider接口获取一组对象集合的实例。Eastasp.Enterprise.Objects.IObjectQueryProvider 此接口实现对象的查询功能。Eastasp.Enterprise.Transactions.ISupportedTransaction此接口实现对象的事物操作。Snake.Net提供了一个高度封装的数据访问层类DataBindObjectDataAccess。DataBindObjectDataAccess实现了上述的所有接口,它是ORM中业务实体对象访问数据库的桥梁。虽然,在一般情况下,我们并不需要接触这个类,但是对这个类还是应该简单了解一下,这将有助于对Snake.Net更深层次的了解。DataBindObjectDataAccess对象是提供了实现了业务实体的的所有数据库访问操作包括创建,更新,删除,获取和查询的能力。
2)CRUD方法(即Create, Retrieve, Update, Delete方法) 曾几何时,程序员天天都将要面对一些简单又繁杂的工作,不停的编写Insert , Update , Delete和Select之类的SQL语句。现在ORM把我们从这种简单重复劳动中解放出来。通过ORM我们可以不再理会那些陈年的SQL语句,只需把精力关注于业务实体的建模中。现在让我们欣赏一下让我们看一下Snake.Net是如何实现CRUD操作的, 再以Customer实体为例,请看以下代码: //declareCustomer customer;IObjectProviderFactory factory; //Createcustomer = new Customer("AROWT");customer.CompanyName = "Eastasp.com";customer.ContactName = "BrUCe";customer.ContactTitle = "owner";customer.Address = "Avda. de la Constituci¨®n 2222";customer.City = "Tsawassen";customer.Region = "BC";customer.PostalCode = "S-958 22";customer.Country = "UK
";customer.Phone = "0621-08460";customer.Fax = "0621-08924";customer.Save();
//get provider factoryfactory = DataBindObject.ProviderFactory; try{//Retrievecustomer = (Customer)factory.GetListProvider(typeof(Customer)).Get(new StringToken("AROWT"));}catch(ObjectNotFoundException ex){Console.Write("Cann't found object.");throw ex;} //Updatecustomer.Phone = "0321-02420";customer.Save(); //Deletecustomer.Delete();从上面的代码中我们可以发现进行Create和Update操作时都只需调用Object.Save(),Snake.Net将根据Object的State的状态值,自动判定是创建还是更新操作并执行。而对于Delete操作也只需要简单的调用一下Object.Delete ()方法。一切看起来太不可思议了,但事实的确如此简单。进行Retrieve操作时,我们应当先获取Customer实体的IObjectListProvider接口,然后根据Customer的唯一标识Unique,取得Customer的实例。我们把上面的代码拆分开来仔细观察下面的代码:
//declareUnique unique;Customer customer;IObjectListProvider provider;IObjectProviderFactory factory; //get list providerfactory = DataBindObject.ProviderFactory;provider = factory.GetListProvider(typeof(Customer)); //create uniqueunique = new StringToken("AROWT"); //get objectcustomer = (Customer)provider.Get(unique); 简单点说,要获取一个对象的实例,首先应当根据这个业务实体的类型,获取对应的ListProvider;然后,生成对象的唯一标识(在Snake.Net中所有的唯一标识都应当是实现IUnique接口的对象,Snake.Net内置定义了GuidToken、StringToken、Int64Token和Int32Token分别对应Guid, string, long, int类型);最后,根据唯一标识调用ListProvider的Get方法获取对象实体。 3)事务处理目前Snake.Net对事物处理,采用了以一种较为简单的方法。对于一个业务实体类而言,对其Save和Delete方法的调用,会自动实现对事务的支持。确切的说,假如一个业务实体的Save或Delete操作可能需要对多张表进行多步操作,那么这些操作将被自动包含在一个事务内,除非你通过配置文件,禁止使用事务。Snake.Net可以通过使用TransactionContext 对象处理一个事务块,包含在该事务块内所有Object对象的Save和Delete操作都将被视为在一个事务内执行。请看下面的代码:
//declareCustomer customer;Employee employee; //use transactionsusing(TransactionContext context = TransactionContext.Create()){ //create customercustomer = new Customer("AROWT");customer.CompanyName = "Eastasp.com";customer.ContactName = "Bruce";customer.ContactTitle = "owner";customer.Address = "Avda. de la Constituci¨®n 2222";customer.City = "Tsawassen";customer.Region = "BC";customer.PostalCode = "S-958 22";customer.Country = "UK
";customer.Phone = "0621-08460";customer.Fax = "0621-08924";customer.Save();
//create employeeemployee = new Employee();employee.LastName = "a";employee.FirstName = "b";employee.Title = "Mr.";employee.BirthDate = new DateTime(1988, 2, 2);employee.Save(); //must set consistentcontext.Consistent = true;} 上述代码会将customer 和employee对象各自的Save方法视为一个事务行为,假如其中任何一个对象保存失败,对会引发事物回滚。非凡需要注重的是必须设置context.Consistent = true;这行代码,否则事务将不会被执行。当然TransactionContext对象也可以使用另一种手动方式执行(调用TransactionContext的Commit和Abort方法)。 4)查询 查询是ORM