利用一个Demo说明Castle+NHibernate的实现

Castle简单介绍

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

官方网站:http://www.castleproject.org/

提到Castle就不得不说说IOC容器.

Ioc介绍

IOC(Inversion of Control,反转控制)是一种面向对象设计原则, 是面向对象领域新兴的编程思想 。其原理是组件本身并不与其他组件建立直接的依赖关系,依赖关系将在组件之外的某个地方建立。这样做主要是为了解耦类之间的关系,使得类更加容易测试、重用,系统更加容易组装和配置。这些先进技术极大促进了软件开发的发展。

还有一种解释:控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例,与传统的编程方式有了很大的不同,”不用你找,我来提供给你”,这就是控制反转的含义.

其实说明白了, 反转控制就是依赖注入,两者概念一样.最终目标是都是为了降低系统的耦合关系.

利用一个Demo实现Castle.net

新建一个解决方案


在测试类中添加一个web.config,然后在web.config中添加配置节点

注意:在isweb处修改为fasle,由于是用单元测试来进行测试,不会web项目,那么就要为fasle.

为web项目的话就要修改为true

        <configSections>
		<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
		<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
		<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
	</configSections>

	<activerecord isWeb="fasle">
		<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="connection.connection_string" value="Initial Catalog=DemoCastle;Data Source=.;uid=sa;password=123456;"/>
			<add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"/>
		</config>
	</activerecord>

在Global.asax中添加source来源

        protected void Application_Start()
        {
            IConfigurationSource source = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
            ActiveRecordStarter.Initialize(typeof(Users).Assembly, source);

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //用到IOC的时候才会用到
            //container = Container.Instance;
        }

添加一个模型类利用castle中的activerecord配置映射

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.ActiveRecord;//需要添加Castle.ActiveRecord引用
using System.ComponentModel.DataAnnotations;
namespace Domain
{
	[PrimaryKey]  //设置为主键
    public int ID { get; set; }
    /// <summary>
    /// Users:实体类(属性说明自动提取数据库字段的描述信息)
    /// </summary>
   [ActiveRecord]
    public class Users :ActiveRecordBase//继承ActiveRecordBase
    {
        /// <summary>
        /// 用户名称
        /// </summary>
        [Property(NotNull = true, Length = 8)]
        [Required]
        [Display(Name = "用户名称")]
        public string UserName { get; set; }

        /// <summary>
        /// 用户的类型
        /// </summary>
        [Property(NotNull = false)]
        [Display(Name = "用户类型")]
        public string UserType { get; set; }
        /// <summary>
        /// 用户密码
        /// </summary>
        [Property(NotNull = true, Length = 12)]
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "用户密码")]
        public string Password { get; set; } 

    }
}


code first需要先在数据库中先创建一个数据库,code first通过模型映射配置会自动创建数据表

数据库名为config中的  Initial Catalog=DemoCastle,根据自己的情况创建数据库。记住只需要创建数据库就行,因为是code first。
后面我会对模型优先、数据优先、和代码优先进行详解。

创建DemoCastle数据库。
在Global.asax添加如下代码,红色标记是添加的Castle的引用文件。大家可以到网上进行搜索下载。要是没有的话可以在我的博客资源中下载Libs包

解压后放到自己的项目里,添加引用的时候就在项目的libs里面添加引用

下载地址:http://download.csdn.net/detail/xhl_james/9873668

我标记为红色边框的是必须添加到自己的项目引用中来


using Castle.ActiveRecord;
using Castle.ActiveRecord.Framework;
using Models;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;


namespace CastleDemo
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            IConfigurationSource source = ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
            ActiveRecordStarter.Initialize(typeof(Users).Assembly, source);


            //创建数据库(第一次运行需要配置),要是第一次创建成功以后就不需要生成数据库了
            ActiveRecordStarter.CreateSchema();//生成数据库




            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

最后只需要通过创建的MVC项目运行就会通过Global.asax添加的代码生成对应的表。

注意:对于不是很熟悉的千万不要在模型类中随便添加映射。对于Code first还不是那么的严重,要是通过数据优先(data first)的话一定要注意模型中的属性和

数据库中的字段类型要相同。


通过创建好以后我们试一试条用ActiveRecordBase中的Create方法创建数据。为了方便起见我就直接在Global.asax中写一个创建。

大家在开发过程中千万不要这么做



最后总结:

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

Castle功能很强大,我们这个架构只是用到了冰山一角,其他功能还需继续研究。

希望大家多多支持,谢谢!





posted @ 2017-06-18 13:38  Jonny-Xhl  阅读(131)  评论(0编辑  收藏  举报