日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层

發(fā)布時間:2025/3/19 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ?在上一篇中,我們已經(jīng)搭建起了整個解決方案的項目,并且建好了數(shù)據(jù)庫,完成了實體類和Nhibernate映射文件.在本文中,將定義數(shù)據(jù)訪問接口,并利用Nhibernate實現(xiàn)接口,利用Spring.net配置起來dao.并對其進行單元測試.

?? 數(shù)據(jù)訪問層也和Petshop等框架一樣,分為數(shù)據(jù)訪問的接口以及實現(xiàn),不過這里的數(shù)據(jù)訪問實現(xiàn)相比之下就清晰和明顯了的多,Nhibernate本身就是支持多數(shù)據(jù)庫的,所以這樣做不是為了多數(shù)據(jù)庫,而是為了Nhibernate的可插撥,即使哪一天發(fā)現(xiàn)由于一些問題,比如說性能問題,可以重新實現(xiàn)IDAL接口,而不會對業(yè)務(wù)層造成比較大的改動.

?? 說到這里,其實我們還不太清楚前臺到底需要哪些功能,所以我們就先簡單的實現(xiàn)實體的增刪改查吧.等需要其它的功能時,再來完善接口和實現(xiàn).

???DirectCenter.IDAL不依賴于Spring或者是Nhibernate,只需要添加項目引用DirectCenter.Model.以用戶來說吧,添加接口IUserDao.cs

IUserDao.cs
using System.Collections;
using DirectCenter.Model;

namespace DirectCenter.IDAL
{
publicinterface IUserDao
{
User FindById(string userId);
void Delete(User user);
User Save(User user);
User SaveOrUpdate(User user);
}
}

?

?? 同樣,我們添加ICompanyDao和IDepartmentDao.

?? 接下來,我們實現(xiàn)剛才的數(shù)據(jù)接口,DirectCenter.DAL項目中添加對DirectCenter.IDAL和DirectCenter.Model的項目引用,然后再添加引用Spring.Data.NHibernate20,Spring.Data,Spring.Core(在lib/Spring.net下面).

??? ?一種方式是可以直接使用Nhibernate完成數(shù)據(jù)訪問:

???????

UserDao.cs
public User Save(User user)
{
//通過一種方式獲取Session
Session session = SessionFactory.OpenSession();
session.Save(user);
}

?

???? 不過我們不打算使用這種單純Nhibernate的方式,而是使用繼承spring對hibernate的封裝類HibernateDaoSupport,這樣我們把Spring.net作為Nhibernate的容器可以方便的進行統(tǒng)一管理和利用一些特性.

????

UserDao.cs
using System.Collections;

using Spring.Data.NHibernate.Support;

using DirectCenter.IDAL;
using DirectCenter.Model;

namespace DirectCenter.DAL
{
publicclass UserDao:HibernateDaoSupport,IUserDao
{
public User Save(User user)
{
HibernateTemplate.Save(user);
return user;
}
public User SaveOrUpdate(User user)
{
HibernateTemplate.SaveOrUpdate(user);
return user;
}
publicvoid Delete(User user)
{
HibernateTemplate.Delete(user);
}
public User FindById(string userId)
{
return HibernateTemplate.Get(typeof(User), userId) as User;
}

}
}

?

?? 同時添加CompanyDao和DepartmentDao.

??? 一個HibernateTemplate怎么就完成了上面的這些操作.Nhibernate相關(guān)的呢?Session在哪里?通過查看代碼,我們知道HibernateTemplate是HibernateDaoSupport的一個屬性,我們就截取HibernateTemplate的一些代碼片斷來簡單看一下:

???

HibernateTemplate.cs
///<summary>
/// Gets or sets the session factory that should be used to create
/// NHibernate ISessions.
///</summary>
///<value>The session factory.</value>
publicoverride ISessionFactory SessionFactory
{
get { return sessionFactory; }
set
{
sessionFactory = value;
}
}


///<summary>
/// Gets or sets the template flush mode.
///</summary>
///<remarks>
/// Default is Auto. Will get applied to any <b>new</b> ISession
/// created by the template.
///</remarks>
///<value>The template flush mode.</value>
publicoverride TemplateFlushMode TemplateFlushMode
{
get { return templateFlushMode; }
set { templateFlushMode = value; }
}

///<summary>
/// Gets or sets a value indicating whether to
/// cache all queries executed by this template.
///</summary>
///<remarks>
/// If this is true, all IQuery and ICriteria objects created by
/// this template will be marked as cacheable (including all
/// queries through find methods).
///<p>To specify the query region to be used for queries cached
/// by this template, set the QueryCacheRegion property.
///</p>
///</remarks>
///<value><c>true</c> if cache queries; otherwise, <c>false</c>.</value>
publicoverridebool CacheQueries
{
get { return cacheQueries; }
set { cacheQueries = value; }
}


publicobject Load(Type entityType, object id, LockMode lockMode)
{
return Execute(new LoadByTypeHibernateCallback(entityType, id, lockMode),true);

}

internalclass LoadByTypeHibernateCallback : IHibernateCallback
{
private Type entityType;
privateobject id;
private LockMode lockMode;

public LoadByTypeHibernateCallback(Type entityType, object id, LockMode lockMode)
{
this.entityType = entityType;
this.id = id;
this.lockMode = lockMode;

}

///<summary>
/// Gets called by HibernateTemplate with an active
/// Hibernate Session. Does not need to care about activating or closing
/// the Session, or handling transactions.
///</summary>
///<remarks>
///<p>
/// Allows for returning a result object created within the callback, i.e.
/// a domain object or a collection of domain objects. Note that there's
/// special support for single step actions: see HibernateTemplate.find etc.
///</p>
///</remarks>
publicobject DoInHibernate(ISession session)
{
if (lockMode !=null)
{
return session.Load(entityType, id, lockMode);
}
else
{
return session.Load(entityType, id);
}
}



}

??? 本質(zhì)還是通過調(diào)用Nhibernate的Session來完成的,具體的原來請查看相關(guān)資料或源代碼.

??? 但是只有上面的代碼肯定是不行的,我們在哪里連接數(shù)據(jù)庫呢?通過IOC向HibernateTemplate中注入SessionFactory,然后在Spring.net中聲明一個SessionFactory的對象.

??? DirectCenter.App添加一個Dao.xml,主要是是進行數(shù)據(jù)訪問的配置.

??? ?

Dao.xml
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db
="http://www.springframework.net/database">
<!-- 用以我們在其它的應(yīng)用程序中,配置數(shù)據(jù)訪問 -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>

<!-- 數(shù)據(jù)庫和Nhibernate的相關(guān)配置 -->
<db:provider id="DbProvider"
provider
="SqlServer-2.0"
connectionString
="Data Source=miaozy;Database=DirectCenter;Integrated Security=true;User Instance=false;"/>

<!--SessionFactory對象,其中包括一些比較重要的屬性 -->
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>DirectCenter.Model</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value
="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="dialect"
value
="NHibernate.Dialect.MsSql2000Dialect"/>
<entry key="hibernate.connection.driver_class"
value
="NHibernate.Driver.SqlClientDriver"/>

</dictionary>
</property>
<property name="ExposeTransactionAwareSessionFactory" value="true"/>
</object>

<!--將id為NHibernateSessionFactory的對象注入到HibernateTemplate中-->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
<property name="TemplateFlushMode" value="Auto"/>
<property name="CacheQueries" value="true"/>
</object>

<!-- 我們的數(shù)據(jù)訪問類,將HibernateTemplate注入進來-->
<object id="UserDao" type="DirectCenter.DAL.UserDao, DirectCenter.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>

<object id="CompanyDao" type="DirectCenter.DAL.CompanyDao, DirectCenter.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>

<object id="DepartmentDao" type="DirectCenter.DAL.DepartmentDao, DirectCenter.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>

</objects>

?

??? 注意: 1.NHibernateSessionFactory的MappingAssemblies屬性,是我們實體映射文件所在的程序集,也可以通過MappingResources屬性引入映射文件,通過ConfigFilenames屬性引入Nhibernate的配置文件hibernate.cfg.xml

??????????? 2.這里的HibernateProperties屬性是指定的是dialect,而不是hibernate.dialect.這是Nhibernate 2.0更新的.不然會提示"Could not find the dialect in the configuration"

?

接下來,就讓測試一下我們的代碼吧.稍微檢驗一下我們的成果.為DirectCenter.UnitTest項目添加相關(guān)的引用,其中重要的是NUnit.Framework和Spring.Testing.NUnit.
添加測試類,UserDaoTest.cs

?

UserDaoTest.cs
using System;

using NUnit.Framework;
using Spring.Testing.NUnit;

using DirectCenter.Model;
using DirectCenter.IDAL;

namespace DirectCenter.UnitTest
{
[TestFixture]
publicclass UserDaoTest : AbstractTransactionalDbProviderSpringContextTests
{
protectedoverridestring[] ConfigLocations
{
get
{
returnnew String[] { "objects.xml" };
}
}

protected IUserDao UserDao
{
get
{
return applicationContext.GetObject("UserDao") as IUserDao;
}
}
[Test]
publicvoid SaveUserTest()
{
User user =new User();
user.UserID ="buyer000";
user.Password ="1356";
user.UserName ="劉翔";
user.ValidFrom = Convert.ToDateTime("2008-8-18");
user.ValidTo = Convert.ToDateTime("2012-8-18");
user.CreateTime = DateTime.Now;
UserDao.Save(user);
}
}
}

?

objectx.xml中引入我們的配置文件dao.xml?,另外應(yīng)用程序配置文件App.Config中有Spring.Net和Nhibernate的相關(guān)配置信息,就不貼太多代碼了.呵呵

利用nunit運行SaveUserTest,發(fā)現(xiàn)顯示測試成功了,不過查看數(shù)據(jù)庫為什么沒有添加進去呢?????

淡定淡定,因為我們并沒有提交,在最后加上?? transactionManager.Commit(transactionStatus);再看一下結(jié)果..剩余的我還都并沒有測試,如果你嘗試,就嘗試其它的dao的方法吧...

?

回過頭來,看我們的Dao的實現(xiàn),基本上都是那幾種,而且繼承于HibernateDaoSupport?,這樣使我們的數(shù)據(jù)訪問直接依賴于Spring.net和Nhibernate,以后想直接拿掉Spring.net或者是更換版本都會有些困難,怎么辦呢.可以寫一個基類繼承于HibernateDaoSupport?,并且通過泛型或者是獲以當(dāng)前類型統(tǒng)一完成這些操作.這個我看下,可以放在最后再來講一下我的實現(xiàn).

?

?ps.希望這篇文章能夠給也在使用類似框架的朋友帶來些收獲,這樣也不會違背放在首頁的原則.目的還是想以這個框架的整合為主,以及我在使用的過程中遇到的一些問題和大家分享.至于Spring.Net或者是Nhibernate,Asp.net mvc相關(guān)的技術(shù),請參考相關(guān)的學(xué)習(xí)資料.或者是在這里給我留言.

?

?本次代碼下載

作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

?

分類: .NET 標(biāo)簽: Spring.Net, Nhibernate, HibernateTemplate, Spring.Testing.NUnit, AbstractTransactionalDbProviderSpringContextTests
本文轉(zhuǎn)自孤獨俠客博客園博客,原文鏈接:http://www.cnblogs.com/lonely7345/archive/2008/09/09/1287212.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。