文章的目的:学习如何去配置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的文件名了。
原创作品出自努力偷懒,转载请说明文章出处:http://www.cnblogs.com/kfarvid/