Castle ActiveRecord(一)概述

news/2024/7/7 23:10:19

一、ActiveRecord与Castle ActiveRecord

    ActiveRecord是《Patterns of Enterprise Application Architecture》中描述的著名模式。基本上,当实例每一行的时候,所有的静态方法会作用于全部纪录。
    Castle ActiveRecord 是ActiveRecord 模式的一个实现,Castle ActiveRecord依赖Nhibernate来完成实际的映像。与单纯的ActiveRecord 相比,Castle ActiveRecord具有以下特点:

  • 敏捷开发(它尽可能多地处理了映射和推断,因此,对你的方案而言,当一些东西发生变化的时候,你不必去钻研文档或者处理大量的xml文档)

  • 预定了像Create, Update, Save, Delete这样的公共方法。

  • 容易实现像Find, FindAll, FindByName等此类的方法。

  • 绘画和事务范围(Session and transaction scopes that abstracts the ISession and translates them to a more natural idiom )

使用Nhibernate,你繁琐的配置工作多于复杂的映射,而使用ActiveRecord却是推进你的生产力的一个保证,你不必再为编写繁冗复杂的映射文件而头疼,ActiveRecord封装了NHibernate的操作,使用特性来代替映射文件,无论何时你需要,ActiveRecord都能给你一个Isession实例,它提供的简洁的O/R映射会让你为实现持久化数据层是那么简单而惊叹!

Castle的官网是http://www.castleproject.org/,这里的文章都参考于此。
二、开始

1、准备工作:

(1)需要引用的程序集:

  • Castle.ActiveRecord.dll

  • Castle.Model.dll

  • Nullables.dll

  • NHibernate.dll

  • Castle.DynamicProxy.dll (Curious? Check DynamicProxy)

  • Nullables.NHibernate.dll

  • log4net.dll

  • Iesi.Collections.dll

(2)一个简单的控制台工程
(3)数据库

None.gifCREATE TABLE Blogs (
None.gif    blog_id     
int IDENTITY(11PRIMARY KEY,
None.gif    blog_name   
varchar(50),
None.gif    blog_author 
varchar(50))
None.gif
None.gif
CREATE TABLE Posts (
None.gif    post_id        
int IDENTITY(11PRIMARY KEY,
None.gif    post_title     
varchar(50),
None.gif    post_contents  
text,
None.gif    post_category  
varchar(50),
None.gif    post_blogid    
int FOREIGN KEY REFERENCES Blogs (blog_id),
None.gif    post_created   
datetime,
None.gif    post_published 
bit
None.gif)
None.gif
None.gif


2、编写Blog 类

首先让我们编写一个继承于ActiveRecordBase的类Blog 。

None.gifpublic class Blog : ActiveRecordBase
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedBlockEnd.gif}

None.gif
None.gif

接下来你必须使用ActiveRecordAttribute来让Blog 类知道对应数据库的哪个表。注意这件事情,类的名称是Blog ,而数据表的名称是Blogs,如果这两者相同,这个地方可以不特别指定类对应的数据表。

None.gif[ActiveRecord("Blogs")]
None.gif
public class Blog : ActiveRecordBase
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedBlockEnd.gif}

None.gif

接下来让我们为类添加属性并指定主键吧:

None.gif[ActiveRecord("Blogs")]
None.gif
public class Blog : ActiveRecordBase
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
private int _id;
InBlock.gif    [PrimaryKey(PrimaryKeyType.Native, 
"blog_id")]
InBlock.gif    
public int Id
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _id; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _id = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif


在这个例子中,主键需要对应到数据表中的blog_id字段。与上面相同,如果数据表中主键名称和属性名称相同的话,这个地方也不需要特别指定对应关系,这会使事情更加简单,例如,如果主键的字段名称也是Id,下面这样就可以了:

None.gif[PrimaryKey]
None.gif
public int Id
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn _id; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ _id = value; }
ExpandedBlockEnd.gif}

None.gif


最后让我们来看完成映射关系的类:

None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
using Castle.ActiveRecord;
None.gif
None.gif
namespace ActiveRecord
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    [ActiveRecord(
"Blogs")]
InBlock.gif    
public class Blog : ActiveRecordBase
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private int _id;
InBlock.gif        
private String _name;
InBlock.gif        
private String _author;
InBlock.gif      
InBlock.gif        [PrimaryKey(PrimaryKeyType.Identity, 
"blog_id")]
InBlock.gif        
public int Id
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn _id; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{ _id = value; }
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [Property(
"blog_name")]
InBlock.gif        
public String Name
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [Property(
"blog_author")]
InBlock.gif        
public String Author
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn _author; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{ _author = value; }
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 删除所有
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        public static void DeleteAll()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            DeleteAll( 
typeof(Blog) );
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 查询所有
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif        public static Blog[] FindAll()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return (Blog[])FindAll(typeof(Blog));
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 根据Id查询
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="id"></param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif        public static Blog Find(int id)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return (Blog)FindByPrimaryKey(typeof(Blog), id);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

我们把类映射到了数据表、字段和主键,代码非常直白。在开始测试之前,我们还必须提供一些配置信息,这些信息包含了数据库联接的一些设置,我们可以使用AppDomain Config文件来保存这些信息,也可以使用硬编码的方式:

None.gif<code>
None.gif
<?xml version="1.0" encoding="utf-8" ?> 
None.gif
<configuration>
None.gif    
<configSections>
None.gif        
<section name="activerecord"
None.giftype
="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
None.gif    
</configSections>
None.gif    
<activerecord>
None.gif      
<config>
None.gif        
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
None.gif        
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
None.gif        
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
None.gif        
<add key="hibernate.connection.connection_string" value="UID=sa;Password=yourpass;Initial Catalog=test;Data Source=." />
None.gif      
</config>
None.gif    
</activerecord>
None.gif
</configuration>
None.gif
</code>
None.gif
None.gif

或者:

None.gif InPlaceConfigurationSource source = new InPlaceConfigurationSource();
None.gif            Hashtable properties 
= new Hashtable();
None.gif            properties.Add(
"hibernate.connection.driver_class""NHibernate.Driver.SqlClientDriver");
None.gif            properties.Add(
"hibernate.dialect""NHibernate.Dialect.MsSql2000Dialect");
None.gif            properties.Add(
"hibernate.connection.provider""NHibernate.Connection.DriverConnectionProvider");
None.gif            properties.Add(
"hibernate.connection.connection_string""UID=sa;Password=;Initial Catalog=test;Data Source=.");
None.gif            source.Add(
typeof(ActiveRecordBase), properties);
None.gif            ActiveRecordStarter.Initialize(source, 
typeof(Blog));


在这个例子中,我们可以象下面这样初始化:

None.gifIConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord"as IConfigurationSource;
None.gif            ActiveRecordStarter.Initialize(source, 
typeof(Blog));

现在你能够象下面这样运行程序了:

None.gif//删除所有
None.gif
Blog.DeleteAll();
None.gif
//添加
None.gif
Blog blog = new Blog();
None.gifblog.Name 
= "ttinfo";
None.gifblog.Author
="ttinfo2";
None.gifblog.Save(); 
// or blog.Create();
None.gif
//按照id查询
None.gif
Int id=1;
None.gifBlog blog
= Blog.Find(id);
None.gif……
None.gif
None.gif

怎么样,Castle ActiveRecord够简单了吧,其实还能够更简单呢,Castle ActiveRecord里面有一个工具,可以自动生成映射类,下一节将介绍。

转载于:https://www.cnblogs.com/ttinfo/archive/2006/07/25/459324.html


http://lihuaxi.xjx100.cn/news/283558.html

相关文章

Python如何优化列表接口进行分页

最近&#xff0c;在做测试开发平台的时候&#xff0c;需要对测试用例的列表进行后端分页&#xff0c;在实际去写代码和测试的过程中&#xff0c;发现这里面还是有些细节的&#xff0c;故想复盘一下分页的目的 做个假设&#xff0c;加入用例库有 1W 条数据&#xff0c;如果想要…

Bert时代的创新:Bert应用模式比较及其它 | 技术头条

作者&#xff1a;张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前在新浪微博 AI Lab 担任资深算法专家。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。他是…

matlab 编arm_Matlab将实现STM32的代码生成、调试及建模功能

ARM、意法半导体(ST)与MATHWORKS携手实现支持STM32微控制器的代码生成、调试及建模功能引用来自&#xff1a;http://www.chinaaet.com/article/index.aspx?id210954ARM与横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics&#xff0c;简称ST&#x…

时事|北大方正破产,负债3029亿元!

来源&#xff1a;中国基金报&#xff08;chinafundnews&#xff09;记者&#xff1a;乔麦体量超3000亿的中国最大校企方正集团&#xff0c;债务危机迎来新进展。日前&#xff0c;方正集团旗下6家上市公司齐发提示性公告表示&#xff0c;北京银行申请对方正集团重整。若能顺利进…

POJ 2185 正解 KMP

题意: 思路&#xff1a; 把每一行压成一个数 求一下 KMP 把每一列压成一个数 求一下KMP 答案就是两个周期之积 网上的好多题解都是错的……………………….. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace …

存儲過程解密SQL

存儲過程解密SQLif exists (select * from dbo.sysobjects where id object_id(N[dbo].[sp_decrypt]) and OBJECTPROPERTY(id, NIsProcedure) 1)drop procedure [dbo].[sp_decrypt]GO /*--破解函數,視圖,程儲過程,触發器,限于SQLSERVER2000 --作者:J9988--*//*--使用示例 --解…

肖仰华:知识图谱落地,不止于“实现”

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;“知识将比数据更重要&#xff0c;得知识者得天下”&#xff0c;去年十月&#xff0c;在 CSDN 对肖仰华教授的一篇约稿里&#xff0c;他指出数据的真正价值蕴含于其深加工的知识中。从 Google 于 2012 年提…

谷歌一员工确诊新冠肺炎:已大面积限制员工出行

北京时间2月29日早间消息&#xff0c;据外媒报道&#xff0c;由于谷歌在瑞士一间办公室的一名员工检测出新冠病毒阳性&#xff0c;该公司目前正限制员工前往意大利、日本、伊朗和韩国&#xff0c;这些国家都已发现病毒蔓延。谷歌发言人向媒体证实&#xff1a;“我们在苏黎世办事…