基于NHibernate的三层结构应用程序开发初步
本文并不是去詳細的介紹如何使用NHibernate,而是通過一個簡單的例子來演示基于NHibernate的三層結構應用程序開發過程。關于NHibernate的有關文檔,DDL已經做了漢化,但是由于英文文檔自身就不完善,所以漢化后也是不全。菩提樹在一篇《NHibernate學習之路》隨筆中談到了學習NHibernate遇到的困難,也希望大家把自己在使用NHibernate中的經驗和心得能夠共享出來,與大家分享。另外我也是剛開始接觸NHiernate,有錯誤之處還請大家指點。
第一步:準備數據表
在這里用一個最簡單的例子,有一張關于的用戶的表,有編號,姓名,密碼,Email地址和最后一次的登錄時間幾個字段。
Create Table Users(
??? LogonID varchar(20) Primary key,
??? Name varchar(40),
??? Password varchar(20),
??? EmailAddress varchar(40) ,
??? LastLogon datetime
)
第二步:創建需要被持久化的類
在.NET中創建一個NHibernateWebDemo.Model的工程,添加User實體類。
//User.cs
using System;
namespace NHibernateWebDemo.Model
{
public class User
{
public User()
{???
??????? }
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;
public string Id?
{
get { return id; }
set { id = value; }
??????? }
public string UserName?
{
get { return userName; }
set { userName = value; }
??????? }
public string Password?
{
get { return password; }
set { password = value; }
??????? }
public string EmailAddress?
{
get { return emailAddress; }
set { emailAddress = value; }
??????? }
public DateTime LastLogon?
{
get { return lastLogon; }
set { lastLogon = value; }
??????? }
??? }
}
第三步:創建持久化映射文件
該文件的命名為User.hbm.xml,并且與User.cs放在同一個目錄里。設置該文件的生成操作屬性為“嵌入的資源”,這一點要切記。另外,使用編號當作主鍵,由用戶輸入,所以在映射文件中用assigned。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernateWebDemo.Model.User, NHibernateWebDemo.Model" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
第四步:進行配置文件的設置
在配置文件中,我們要告訴NHibernate所使用的數據庫是什么,以及如何連接該數據庫。
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<nhibernate>
<add key="hibernate.connection.provider"
?????????????????????? value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.dialect"
?????????????????????? value="NHibernate.Dialect.MsSql2000Dialect"/>
<add key="hibernate.connection.driver_class"
?????????????????????? value="NHibernate.Driver.SqlClientDriver"/>
<add key="hibernate.connection.connection_string"
?????????????????????? value="server=.;uid=sa;pwd=sa;database=test"/>
</nhibernate>
第五步:編寫數據訪問層的公用類
在這里,編寫了兩個公用的類,分別進行Session的創建和實體的操作。在這兩個類中用單件模式,來限制Session的創建。為了做到與具體的應用程序無關,在這里把程序集的名稱作為參數,傳遞給OpenSession()方法。可以把這兩個類單獨放在一個名為Common的工程下,這里先把它們放在DAL層中。這兩個類只是個人的一種寫法,大家可以自行去編寫。
//SessionFactory.cs
using System;
using System.Reflection;
using System.Data;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace NHibernateWebDemo.DAL
{
public class SessionFactory
{
public SessionFactory()
{
??????? }
private static ISessionFactory sessions;
private static Configuration cfg;
static readonly object padlock = new object();
public static ISession OpenSession(string AssemblyName)
{
if(sessions == null)
{
lock(padlock)
{
if(sessions == null)
{
??????????????????????? BuildSessionFactory(AssemblyName);
??????????????????? }
??????????????? }
??????????? }
return sessions.OpenSession();
??????? }
private static void BuildSessionFactory(string AssemblyName)
{
??????????? cfg = new Configuration();
??????????? cfg.AddAssembly(AssemblyName);
??????????? sessions = cfg.BuildSessionFactory();
??????? }
??? }
}
//EntityControl.cs
using System;
using System.Collections;
using NHibernate;
namespace NHibernateWebDemo.DAL
{
public class EntityControl
{
private static EntityControl entity;
private string _AssemblyName;
static readonly object padlock = new object();
public static EntityControl CreateEntityControl(string AssemblyName)
{
if(entity == null)
{
lock(padlock)
{
if(entity == null)
{
??????????????????????? entity = new EntityControl();
??????????????????????? entity._AssemblyName = AssemblyName;
??????????????????? }
??????????????? }
??????????? }
return entity;
??????? }
public void AddEntity(Object entity)
{
??????????? ISession session = SessionFactory.OpenSession(_AssemblyName);
??????????? ITransaction transaction = session.BeginTransaction();
try
{
??????????????? session.Save(entity);
??????????????? transaction.Commit();
??????????? }
catch(Exception ex)
{
??????????????? transaction.Rollback();
throw ex;
??????????? }
finally
{
??????????????? session.Close();
??????????? }
??????? }
public void UpdateEntity(Object entity,Object key)
{
??????????? ISession session = SessionFactory.OpenSession(_AssemblyName);
??????????? ITransaction transaction = session.BeginTransaction();
try
{
??????????????? session.Update(entity,key);
??????????????? transaction.Commit();
??????????? }
catch(Exception ex)
{
??????????????? transaction.Rollback();
throw ex;
??????????? }
finally
{
??????????????? session.Close();
??????????? }
??????? }
public void DeleteEntity(object entity)
{
??????????? ISession session = SessionFactory.OpenSession(_AssemblyName);
??????????? ITransaction transaction = session.BeginTransaction();
try
{
??????????????? session.Delete(entity);
??????????????? transaction.Commit();
??????????? }
catch(Exception ex)
{
??????????????? transaction.Rollback();
throw ex;
??????????? }
finally
{
??????????????? session.Close();
??????????? }
??????? }
public IList GetEntities(string strHQL)
{
??????????? IList lst;
??????????? ISession session = SessionFactory.OpenSession(_AssemblyName);
??????????? ITransaction transaction = session.BeginTransaction();
??????????? lst=session.Find(strHQL);
??????????? transaction.Commit();
??????????? session.Close();
return lst;
??????? }
??? }
}
第六步:編寫數據訪問層
創建一個名為NHibernateWebDemo.DAL的工程,數據訪問層的代碼編寫非常簡單,在創建EntityControl的實例時,需要把Model的程序集名稱作為參數傳入,可以通過配置文件來避免程序集名稱的硬編碼。
//UserDAL.cs
using System;
using System.Collections;
using NHibernateWebDemo.Model;
namespace NHibernateWebDemo.DAL
{
public class UserDAL
{
private EntityControl control;
public UserDAL()
{
??????????? control = EntityControl.CreateEntityControl("NHibernateWebDemo.Model");
??????? }
public void AddUser(User user)
{
??????????? control.AddEntity(user);
??????? }
public void UpdateUser(User user,string Id)
{
??????????? control.UpdateEntity(user,user.Id);
??????? }
public void DeleteUser(User user)
{
??????????? control.DeleteEntity(user);
??????? }
public IList GetAllUsers(string strHQL)
{
return control.GetEntities(strHQL);
??????? }
??? }
}
第七步:編寫業務邏輯層
建立NHibernateWebDemo.BLL工程,為了簡單期間,在業務邏輯層中我沒有做任何的業務檢測。
//UserBLL.cs
using System;
using System.Collections;
using NHibernateWebDemo.DAL;
using NHibernateWebDemo.Model;
namespace NHibernateWebDemo.BLL
{
public class UserBLL
{
public void AddUser(User user)
{?
??????????? UserDAL dal = new UserDAL();????????
??????????? dal.AddUser(user);
??????? }
public void UpdateUser(User user,string Id)
{
??????????? UserDAL dal = new UserDAL();
??????????? dal.UpdateUser(user,Id);
??????? }
public void DeleletUser(User user)
{
??????????? UserDAL dal = new UserDAL();
??????????? dal.DeleteUser(user);
??????? }
public IList GetAllUsers(string strHQL)
{
??????????? UserDAL dal = new UserDAL();
return dal.GetAllUsers(strHQL);
??????? }
??? }
}
第八步:實現用戶界面
用戶界面很簡單,這里就不給出代碼了,完成后的用戶界面:
轉載于:https://www.cnblogs.com/360S/archive/2011/09/28/2194123.html
總結
以上是生活随笔為你收集整理的基于NHibernate的三层结构应用程序开发初步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语法:MySQL中INSERT IGNO
- 下一篇: 大数据量导出Excel ---待测试