Castle学习系列之一:初识Castle

说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之。

主要内容

1.Castle概述

2.如何开始使用Castle

Castle概述

  Castle是针对.NET平台的一个开源项目,从数据访问框架ORMIOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务。

   ORM对象-关系映射(OBJECT/RELATION MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,  关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中    的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系    数据库数据的映射。面向对象是从软件工程基本原则(如耦合聚合封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个    不匹配的现象,对象关系映射技术应运而生。

  让我们从O/R开始。字母O起源于 对象(OBJECT),而R则来自于 关系(RELATIONAL)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对  象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。当你开发一个应用程序的时候(不使用O/R MAPPING),你可能会写不少数据访问层的代码,用来从数据库  保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。为解决这个问题,我们引入一个O/R MAPPING。实质上,一个O/R MAPPING会为你生成DAL。与其自己写DAL代码,不如用O/R MAPPING。你用O/R MAPPING保存,删除,读取对象,O/R MAPPING负责生成SQL,你只需要关心对象就好。
 
  Ioc,控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。控制反转还有一个名字叫做依赖注入(Dependency Injection),简称DI
  IoC不是什么技术,是一种设计模式,可以把IoC模式看做是工厂模式的升华。系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
 
如何开始使用Castle(使用VS2012和SQLServer 2008 R2
 
  1、我们先从官网下载其实现的程序集(ACTIVERECORD:用于ORM映射,其内部封装了NHibernate;WINDSOR:IOC容器)
 
  2、生成物理表,SQL语句如下
CREATE TABLE [dbo].[Users] (
    [LogonID] [int] IDENTITY (1, 1) NOT NULL ,
    [LogonName] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    [Password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [EmailAddress] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    [LastLogon] [datetime] NULL 
) ON [PRIMARY]
GO

  3、编写Users实体类 (项目新增类文件user.cs)

using System;
using System.Collections;
using Castle.ActiveRecord;

//注意下面两个引用哦!


namespace ARDemo
{
    /**//// <summary>
    /// User 的摘要说明。
    /// </summary>

    //为User类添加特性,其实就是告诉ActiveRecord,User类所对应的数据库中的数据表名为Users
    [ActiveRecord("Users")]

      // 新建一个User类并让它继承于ActiveRecordBase类
    public class User : ActiveRecordBase
    {

      //为实体类添加属性
        private int _id;

        private string _name;

        private string _password;

        private string _emailAddress;

        private DateTime _lastLogon;
        //[PrimaryKey]特性指定Id作为主键,并且说明了主键的类型为自增型的
        [PrimaryKey(PrimaryKeyType.Identity, "LogonID")]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        //下面每一个属性上面都加上了特性[Property()]     
        [Property("LogonName")]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        
        [Property("Password")]
        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }
        
        [Property("EmailAddress")]
        public string Address
        {
            get { return _emailAddress; }
            set { _emailAddress = value; }
        }
        
        [Property("LastLogon")]
        public DateTime LastLogon
        {
            get { return _lastLogon; }
            set {_lastLogon = value; }
    }
    //根据需要为实体类加上静态的操作方法,
       //至于Create(),Update(),Delete(),Save()等方法则会直接从ActiveRecordBase基类中继承
        public static void DeleteAll()
        {
            DeleteAll( typeof(User) );
        }

        public static IList FindAll()
        {
            return (IList) FindAll( typeof(User) );
        }

        public static User Find(int id)
        {
            return (User) FindByPrimaryKey( typeof(User), id );
        }
    }
}

  4、配置Castle ActiveRecord

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
  </configSections>
  <activerecord>
    <config>
      <add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
      <add key="dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
      <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
      <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
      <add key="connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
    </config>
  </activerecord>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

  5、初始化,可以再程序开始的地方执行(如Application_Start)

IConfigurationSource cfgSrc = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize(cfgSrc, typeof(User));

  6、进行实际的运用

User user = new User();
user.Name = "XXX";
user.Password = "123";
user.Address = "XXX@126.com";
user.LastLogon = DateTime.Now;

user.Create();

  此时,运行程序之后,就会发现数据库中添加了一条新的纪录。

 

遇到的问题

  如果你采用最新版的Castle的程序集(非1.0版本),然后参照李会军先生文章的配置,可能会出错Could not find the dialect in the configuration。这个时候我解决问题的方法是将配置文件中的hibernate前缀给去掉。

  去掉前

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
  </configSections>
  <activerecord>
    <config>
      <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
      <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
      <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
      <add key="hibernate.proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
      <add key="hibernate.connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
    </config>
  </activerecord>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

  去掉后

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
  </configSections>
  <activerecord>
    <config>
      <add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
      <add key="dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
      <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
      <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
      <add key="connection.connection_string" value="Data Source=localhost;Initial Catalog=Study;User ID=sa;Password=******" />
    </config>
  </activerecord>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

 

再次说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之。

posted @ 2014-05-03 21:45  新爱  阅读(390)  评论(0)    收藏  举报