Spring.NET学习笔记二(NHibernate的配置)

来源:互联网 发布:du指令文件夹linux命令 编辑:程序博客网 时间:2024/05/16 09:41

 文章的目的:学习如何去配置Spring.NET的NHibernate。因此,有些东西直接是使用现成的。
从spring.net官网下载了最新版,里面有个Spring.Data.NHibernate.Northwind项目,我们这节的 部分代码是直接引用这个项目的。
1:创建一个网站文件夹。sphbm_test。
2:在解决方案中选择添加现有网站,选择刚才创建的文件夹。设置好这个网站的相关配置,特别是使用的FrameWork的版本,我们一般都使用2.0的版本。
3:在这个解决方案中引入现成的东西:Spring.Northwind.Dao、Spring.Northwind.Dao.NHibernate和Spring.Northwind.Web.References。
4:网站项目中添加引用的,就选择项目中的:Spring.Northwind.Web.References,这个项目是所有有关spring和NHibernate用到的引用。
5:剩下的就是我们真正要做的学习如何配置Spring.NET的NHibernate。下面的代码可以单独放在一个xml文件里面,只要在spring的context中加入它就行了:
如我在web.config的配置中的代码是这样的:

Code
  <spring>
    <context>
      <!--SP3: 此处的配置文件是指包括了Spring.NET对象定义的XML文件,而非特指.config文件 -->
      <resource uri="config://spring/objects"/>
      <!--下面是引用.NET程序集内嵌资源时的URI语法:
      assembly://<AssemblyName>/<NameSpace>/<ResourceName>
      assembly://<程序集>/<命名空间>/<资源名称>
      SP_Manual:加入不同项目的不同xml配置信息。如:
      例:<resource uri="assembly://DZ_Portal.App/DZ_Portal.App/spring.net_bean_SysDepartMentPageAdmin.xml"/>
      -->
      <resource uri="~/Web_Page.xml"/>
      <resource uri="~/Web_Data.xml"/>
      <resource uri="~/Web_UseFul.xml"/>
    </context>
    <!-- SP4:objects节点的xmlns元素是必需的,必须根据不同的应用添加不同的命名空间 -->
    <objects xmlns="http://www.springframework.net"/>
  </spring>

下面的是Web_Data.xml的内容,是完整的spring的NHibernate配置,基本上资源中加入这个xml就可以使用NHibernate了。

Code
<?xml version="1.0" encoding="utf-8" ?>
<!-- 注意objects节点需要引用命名空间xmlns:d="http://www.springframework.net/database" -->
<objects xmlns="http://www.springframework.net"
         xmlns:db="http://www.springframework.net/database">

  <!--spring集合nHibernate
    NH1:定义数据库链接对象dbProvider(数据提供者)
    注意:这里的db:为命名空间前缀,与objects里的xmlns:db这里的db对应。

  <db:dbProvider id="DbProvider"
                   provider="SqlServer-2.0"
                   connectionString="Data Source=./SQLExpress;Integrated Security=true;User Instance=true;AttachDBFilename=|DataDirectory|/Northwnd.mdf"/>
-->

  <object id="DbProvider" type="Spring.Data.Common.DbProviderFactoryObject,Spring.Data">
    <property name="Provider" value="SqlServer-2.0"/>
    <property name="ConnectionString" value="server=(local);user id=sa;pwd=11;database=Northwind"/>
  </object>
 
  <!--
Provider名称和对应的数据库如下所示。
SqlServer-1.1:Microsoft SQL Server,provider V1.0.5000.0,用于.NET框架V1.1。
SqlServer-2.0(System.Data.SqlClient的别名):Microsoft SQL Server,provider V2.0.0.0,用于.NET框架V2.0。
OleDb-1.1:OleDb,provider V1.0.5000.0,用于.NET框架V1.1。
OleDb-2.0(System.Data.OleDb的别名):OleDb,provider V2.0.0.0,用于.NET框架V2.0。
OracleClient-2.0(System.Data.OracleClient的别名):Oracle,Microsoft provider V2.0.0.0。
OracleODP-2.0(System.DataAccess.Client的别名):Oracle, Oracle provider V2.102.2.20。
MySql:MySQL, MySQL provider 1.0.7.3007(按:Spring.NET的当前版本(1.1 Preview3)需要MySqlConnector 1.0.7.30072,您可以从MySql的网站上单独下载,当然您也可以修改Spring.Data以使用1.08 RC或5.02beta版。)
  -->
   
  <!-- NH2:SessionFactory配置中,指明需要环境映射的程序集名称,
    通俗说法是:哪些层会在集成环境中,被直接引用?
  -->
  <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
    <property name="DbProvider" ref="DbProvider"/>
    <!-- NHibernate的hbm.xml配置文件的程序集名称 -->
    <property name="MappingAssemblies">
      <list>
        <value>Spring.Northwind.Dao.NHibernate</value>
      </list>
    </property>
    <!--
    HibernateProperties节中,可以指定调试时是否显示生成的sql语句。
    同时,能配置缓存事宜:此处用到的是NHibernate.Caches.SysCache。
    -->
    <property name="HibernateProperties">
      <dictionary>
        <entry key="hibernate.connection.provider"
               value="NHibernate.Connection.DriverConnectionProvider" />
       
        <entry key="hibernate.dialect"
               value="NHibernate.Dialect.MsSql2000Dialect" />
       
        <entry key="hibernate.connection.driver_class"
               value="NHibernate.Driver.SqlClientDriver" />
       
        <entry key="show_sql" value="false" />
       
        <entry key="hibernate.query.factory_class"
               value="NHibernate.Hql.Classic.ClassicQueryTranslatorFactory" />
       
        <entry key="relativeExpiration" value="5" />

      </dictionary>
    </property>
    <property name="ExposeTransactionAwareSessionFactory" value="true" />
  </object>
 
  <!-- NH3:事务管理器 -->
  <object id="HibernateTransactionManager"
          type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
    <property name="DbProvider" ref="DbProvider" />
    <property name="SessionFactory" ref="NHibernateSessionFactory" />
  </object>

  <!-- NH4:事务拦截器 -->
  <object id="TransactionInterceptor"
          type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">
    <property name="TransactionManager" ref="HibernateTransactionManager" />
    <property name="TransactionAttributeSource">
      <object type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data" />
    </property>
  </object>
 
  <!-- NH5:nHibernate的模板
    既nHibernate项目已经为开发者写好了一套通用的方法,
    能便捷的操作数据库,此处将SessionFactory植入引用即能让它工作起来。 
  -->
  <object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
    <property name="SessionFactory" ref="NHibernateSessionFactory" />
    <property name="TemplateFlushMode" value="Auto" />
    <property name="CacheQueries" value="true" />
  </object>
 
</objects>

其中大部分地方都有注释了,这里我不多说了。详细的还是看帮助文件的说明比较好。

6。看看我们配置好后如何使用它。我们依照Spring.Data.NHibernate.Northwind的例子,来做个简单的,显示Customer表的数据,因此,我们也可以拷贝CustomerList.aspx的相关代码过来就行了,把其它的东西去掉了。下面是CustomerList.aspx的代码:

Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CustomerList.aspx.cs" Inherits="CustomerList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DataGrid id="customerList" runat="server"
           AllowPaging="true"
           AllowSorting="false"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AutoGenerateColumns="false"
           ShowFooter="true"
      >
         <Columns>

            <asp:BoundColumn HeaderText="Id" DataField="ID" />
            <asp:BoundColumn HeaderText="Name" DataField="ContactName" />
            <asp:BoundColumn HeaderText="Company" DataField="CompanyName"/>
            <asp:ButtonColumn CommandName="EditCustomer" Text="Edit" />
            <asp:ButtonColumn CommandName="ViewOrders" Text="Orders" />

         </Columns>
      </asp:DataGrid>
    </div>
    </form>
</body>
</html>
下面是它的cs代码:

Code
using System;
using System.Collections;
using System.Web.UI.WebControls;
using Spring.Northwind.Dao;
using Spring.Northwind.Domain;

public partial class CustomerList : Spring.Web.UI.Page
{
    private ICustomerDao customerDao;

    public ICustomerDao CustomerDao
    {
        set { this.customerDao = value; }
    }


    public CustomerList()
    {
        this.InitializeControls += new EventHandler(Page_InitializeControls);
        this.DataBound += new EventHandler(Page_DataBound);
        this.DataUnbound += new EventHandler(Page_DataUnbound);
    }

    override protected void InitializeDataBindings()
    {
        base.InitializeDataBindings();

        // do the "one time" setup for databinding
    }

    private void Page_DataBound(object sender, EventArgs e)
    {
        // perform custom tasks for binding data from model to the form
    }

    private void Page_DataUnbound(object sender, EventArgs e)
    {
        // perform custom tasks for unbinding data from form to the model
    }

    private void Page_InitializeControls(object sender, EventArgs e)
    {
        // create/initialize controls here
        customerList.DataSource = customerDao.FindAll();
        customerList.ItemCommand += new DataGridCommandEventHandler(CustomerList_ItemCommand);
        customerList.PageIndexChanged += new DataGridPageChangedEventHandler(CustomerList_PageIndexChanged);
        if (!IsPostBack)
        {
            customerList.DataBind();
        }
        else
        {
            customerList.ItemCreated += new DataGridItemEventHandler(this.CustomerList_ItemCreated);
        }
    }

    private void CustomerList_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
    {
        customerList.CurrentPageIndex = e.NewPageIndex;
        customerList.DataBind();
    }

    private void CustomerList_ItemCommand(object source, DataGridCommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "ViewOrders":
            case "EditCustomer":
                customerList.SelectedIndex = e.Item.ItemIndex;
                //customerEditController.EditCustomer(this.SelectedCustomer);
                //SetResult(e.CommandName);
                break;
        }
    }

    private void CustomerList_ItemCreated(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.DataSetIndex > -1)
        {
            e.Item.DataItem = ((IList)customerList.DataSource)[e.Item.DataSetIndex];
        }
    }
}

7:我们分析一下代码,得出:
这个页面CustomerList.aspx需要用到对象:CustomerDao,因此,我们需要对该页面进行依赖注入的spring配置。因此,在Web_Page.xml中的代码是:(这个xml记得加入spring的资源里)

Code
<?xml version="1.0" encoding="utf-8" ?>
<!-- 必须以<objects xmlns='http://www.springframework.net'>这个
     为开始,原因.暂时不知道。
-->
<objects xmlns='http://www.springframework.net'>
  <!-- 页面定义 -->
  <object type="~/Default.aspx" >
    <property name="Test" value="CoreCommBLL" />
  </object>
 
  <object type="CustomerList.aspx" >
    <property name="CustomerDao" ref="CustomerDao" />
  </object>
</objects>

我们需然是用了CustomerDao,但是,我们还得知道CustomerDao究竟是什么东西,因此,我们还需要在spring的配置中加入CustomerDao。因此,在另外一个文件Web_UseFul.xml(同样需要加入spring的资源中)
的代码如下:

Code
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns='http://www.springframework.net'>
 
<!-- Data Access Objects -->
<object id="CustomerDao" type="Spring.Northwind.Dao.NHibernate.HibernateCustomerDao, Spring.Northwind.Dao.NHibernate">
  <property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
 
</objects>


到这里,这个例子就完成了,其实这里的spring配置都可以放在一个文件里面去的,为何我要分开?那是因为把这些配置作适当的分类,可以方便我们的管理以及查看。这个就看大家的使用习惯来定义这些xml的文件名了。

原创粉丝点击