当前位置: 首页 > 编程日记 > 正文

Castle ActiveRecord(一)概述

一、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

相关文章:

一步步学习SPD2010--第十一章节--处理母版页(8)--从母版页创建网页

一步步学习SPD2010--第十一章节--处理母版页&#xff08;8&#xff09;--从母版页创建网页 在SPD中&#xff0c;你可以使用许多不同的方法创建ASP.NET页面。然而&#xff0c;因为页面将是SP网站的一部分&#xff0c;你很可能想像其他页面一样&#xff0c;保持相同的导航元素和外…

Confluence 6 查看空间活动

空间活动信息是默认禁用&#xff08;disabled by default&#xff09;的。活动&#xff08;Activity&#xff09;的标没有显示&#xff0c;如果你的 Confluence Usage Stats 插件没有启用的。请查看下面的说明&#xff1a; 如果启用的话&#xff0c;空间活动界面显示了每一个空…

flash模拟EEROM

FLASH中&#xff1a;0x08000000--0x08000000SIZE保存的是用户代码 Rule&#xff1a; 16位为传输单位 读数据&#xff1a; u16 STMFLASH_ReadHalfWord(u32 faddr) 可以在通用地址空间直接寻址&#xff1a;data*(vu16*)ADDR;[ADDR为32位数据&#xff0c;指向的数据为uv16型]写数据…

OSChina 周六乱弹 —— 就少个接吻的女友了

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 andonny &#xff1a;分享Mamas & The Papas的单曲《California Dreaming》 《California Dreaming》- Mamas & The …

存儲過程解密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--*//*--使用示例 --解…

软件缺陷生命周期图示及当中涉及到的缺陷的状态

缺陷状态&#xff1a; 激活/打开 已修正 已关闭/非激活 重新打开(对应图示验证通过否N) 推迟(对应图示的延期) 保留(对应图示无法解决) 不能重现 需要更多信息

Adding a QR Code Reader in Flex on Android

<?xml version"1.0" encoding"utf-8"?> <s:View xmlns:fx"http://ns.adobe.com/mxml/2009" xmlns:mx"library://ns.adobe.com/flex/mx"xmlns:s"library://ns.adobe.com/flex/spark" title"HomeView"&g…

41-高级路由:BGP AS长度:接收一切、最大AS长度、不比较AS长度

一、实验拓扑&#xff1a;二、实验要求&#xff1a;1、R4配置同上个实验&#xff1b;2、R3配置接收的路由包含最大AS长度为4&#xff1b;3、R3配置隐藏命令&#xff0c;不比较AS长度&#xff1b;4、R5配置不管收到的路由有没有包含本地AS都收入&#xff08;之前R4已经配置了4.4…

利用动态加载模板,配合ajax实现无刷新操作

关键字&#xff1a;DataGrid 动态模板 Ajax我们使用ajax实现无刷新界面时&#xff0c;对于DataGrid&#xff0c;Repeater等列表还是比较麻烦的&#xff0c;经过我的尝试&#xff0c;找出一种比较合理的方法&#xff0c;可以免除对html的加工处理&#xff0c;随时获取到数据列表…

如何利用业余时间提升自己

1、要找到心动的目标 先要找到自己如果提升哪一方面的能力&#xff0c;能够对自己的工作有较大的贡献 找到你想成为的人 你从他身上找到你想拥有的技能 你喜欢某个人的身上的某种行为表现 也是你的榜样 或者从你的爱好着手发现你在爱好中能够得到提升的点 我想发展的工作技能是…

Eclipse插件的安装方法

转自&#xff1a;http://blog.csdn.net/zhangyabinsky/article/details/7043435 Eclipse插件的安装有两种方法 &#xff1a;一个是在线安装&#xff0c;另一个就是手动安装。 在线安装比较简单&#xff1a;点击Help>>Install New Software..如图&#xff1a; 这样会跳出一…

(转)uml 静态视图依赖

依赖 依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形&#xff0c;提供者的某些变化会要求或指示依赖关系中客户的变化。 根据这个定义&#xff0c;关联和泛化都是依赖关系&#xff0c;但是它…

白盒测试各种“覆盖”间的拓扑关系及白盒用例常用要求

SC为语句覆盖 DC为分支覆盖/判定覆盖 CC为条件覆盖 CDC为判定-条件覆盖 MCC为条件组合覆盖 MC/DC修正条件/判定覆盖 BPC为基本路径覆盖

[转]实战 SQL Server 2008 数据库误删除数据的恢复

实战 SQL Server 2008 数据库误删除数据的恢复 关键字&#xff1a;SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我&#xff0c;他用delete语句误删除了SQL Server 2008数据库中两个表中的所有记录&#xff0c;而这个数据库之前没有任何备份。让我帮…

水面加上了Perlin Noise

通过用躁点扰动法线图&#xff0c;水面显得更有质感Real time Shadow 转载于:https://www.cnblogs.com/badkeeper/articles/495443.html

事件冒泡和阻止事件冒泡

事件冒泡 当事件发生后&#xff0c;这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢&#xff1f;因为事件源本身&#xff08;可能&#xff09;并没有处理事件的能力&#xff0c;即处理事件的函数&#xff08;方法&#xff09;并未绑定在该事件源上。例如我们点击一…

不使用powerdesigner手工绘制用例图例题详解

文章目录1.题目2.分析过程3.结果4.需要注意的细节5.本题易错的地方1.题目 根据以下场景绘制用例图。 某公司预开发一个反馈系统作为其CRM&#xff08;客户关系管理&#xff09;的一部分。系统基本功能描述如下&#xff1a; &#xff08;1&#xff09;客户可通过B/S系统在该公司…

zoj 1204 Additive equations

ACCEPT acm作业http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId204因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做&#xff0c;结果发现网上都是用数组简单明了地实现了&#xff0c;显得我的代码&#xff0c;特么地超级恶心&#xff01;…

c#中的静态类

如果一个类中的所有方法都是类方法&#xff0c;那么就用static来定义这些方法&#xff0c;如果这个类又要增加一些属性&#xff0c;以供这些方法使用&#xff0c;那么就要使用static来定义这些属性&#xff0c;如果又要给这些属性初始化&#xff0c;就要使用静态构造函数&#…

golang flag简单用法

版权声明&#xff1a;本文可能为博主原创文章&#xff0c;若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/80972643 package mainimport ("flag""strings""os""fmt" )var ARGS stringfunc main() {var uptime…

四种JOIN简单实例

前提 现在有班级表class和学生表stud 各有两条数据 共同的属性是classId class表 stud表 可以看到&#xff1a;班级表无1班&#xff0c;学生表3班无学生 1.INNER JOIN 在表中存在至少一个匹配时返回行。和JOIN相同 或者 2.LEFT JOIN 从左表&#xff08;table1&#xff09…

Linux运维人员-服务器组成硬件基础

第1章 1.1关于运维人员 1.1.1 运维的职责 数据不能丢 网站7*24小时运行 保证用户体验&#xff08;用户体验要好&#xff09; 1.1.2 运维原则 简单、易用、高效 简单、粗暴 1.2 服务器 1.2.1服务器尺寸 服务器厚度&#xff08;厚度&#xff09; 服务器尺寸单位为U 1U4.45cm 1…

K - 近邻算法

K - 近邻算法&#xff08;KNN&#xff09;&#xff0c;他的工作原理&#xff1a;存在一个样本数据集合&#xff0c;也称为训练样本集&#xff0c;并且样本集合中每个数据都存在标签&#xff0c;即我们知道样本集合中每一个数据与所属分类的对于关系。输入没有标签的新数据后&am…

必须掌握的八个DOS命令 [转]

一&#xff0c;ping    它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说&#xff0c;ping命令是第一个必须掌握的DOS命令&#xff0c;它所利用的原理是这样的&#xff1a;网络上的机器都有唯一确定的IP地址&#xff0c;我们给目标…

SQL,NoSQL优缺点总结

SQL优点&#xff1a; 保持数据一致性&#xff08;最大优势&#xff09; 由于以标准化为前提&#xff0c;数据更新的开销很小 可以进行 Join 等复杂查询 SQL不足&#xff1a; 大量数据的写入处理 为有数据更新的表做索引或表结构&#xff08;schema&#xff09;变更 字段不固定…

iOS常用动画 类封装

//这是一个很好的动画封装类 很容易明白很详细 和大家分享 // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyright (c) 2013年 VincentXue. All rights reserved. //#import /**! 导入QuartzCore.framework** Exampl…

规范化制度保障安擎高品质产品

企业的制度规范是公司管理的依据和准则。一套科学完整的管理制度&#xff0c;有利于维护工作秩序&#xff0c;提高工作效率&#xff0c;也可以保证企业的正常运转和职工的合法利益不受侵害。据内部核算&#xff0c;安擎计算机有限公司在2017年十二次月度产品测试中&#xff0c;…

带进度条的ASP无组件断点续传下载代码

<%LANGUAGE"VBSCRIPT" CODEPAGE"936"%><%Option Explicit%><% 带进度条的ASP无组件断点续传下载简介&#xff1a; 1)利用xmlhttp方式 2)无组件 3)异步方式获取&#xff0c;节省服务器资源 4)服务器到服务器的文件传送。(当然&am…