基于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的三层结构应用程序开发初步相关推荐
- MVC三层结构应用程序开发的优缺点
1.一个典型的应用软件包括展现给用户界面的编码.业务处理模块编码.数据访问处理编码几个部分.如果将这些部分放在一起编程,则应用软件内部各元素耦合性非常高:现在人们常将它们分开开发,然后将它们组装成一个 ...
- 用MS.NET开发三层结构应用程序[转载]
用MS.NET开发三层结构应用程序[转载] 原文: http://industry.ccidnet.com/art/294/20030526/47418_1.html 传统两层结构 在过去应用系统开发 ...
- 基于Golang的CLI 命令行程序开发
基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...
- 〈转〉用VS2005.NET进行三层结构应用程序的开发
1.三层之间的关系: 三层是指:界面显示层(UI),业务逻辑层(Business),数据操作层(Data Access) 文字描述: Clients对UI进行操作,UI调用Business进行相应的运 ...
- 基于VB环境下的语音识别程序开发方法
摘要:语音识别技术的发展和广泛应用,使用户与计算机的对话方式不再仅仅局限在使用键盘或鼠标发送指令的方式.本文在visual basic 编程环境下使用Microsoft Speech SDK中的语音接 ...
- 基于mpvue框架搭建微信小程序开发环境
一.按照mpvue官网新建前台工程 http://mpvue.com/mpvue/quickstart.html(mpvue快速上手教程) 二.路由功能代码实现 mpvue对vue-router的支持 ...
- 基于go语言结合微信小程序开发的微商城系统
最近我录制的一门<Golang微信小程序微商城系统原型>,这门免费课程特别适合在校大学生或者刚毕业的大学生,go语言初学者以及想要从事微商城开发项目入门的小伙伴们来学习.在课程当中我不仅仅 ...
- 嵌入式开发基于linux系统的c语言程序开发调试工具
在学习嵌入式的过程中,我们接触最多的就是Linux环境,而在嵌入式 linux 领域我们最常用的代码调试工具应该就是GDB了,通过简单的学习GDB调试工具,发通过使用它可以有效的解决一些问题. gdb ...
- 第十五周学习周记——微信小程序开发初步
第十五周学习周记 前言 一.小程序简介 二.小程序代码构成 1. JSON配置 2. WXML模板 3. WXSS样式 4. JS逻辑交互 总结 前言 这一周将开始微信小程序的学习. 一.小程序简介 ...
最新文章
- UVA 1646 Edge Case
- 《慕课React入门》总结
- mfc指示灯报警显示_消防水炮需要外置声光报警吗
- android获取app用户数据,Android 原生app获取用户授权访问Autodesk云应用数据
- 宝鸡文理学院c语言试题,宝鸡文理学院试题电子电磁场与电磁波A
- mysql sum计算效率很慢_MySQL基础之分组函数
- Centos6.5 Couchdb安装
- 伪验证码(含随机验证码方法)js+css
- mysql 8.0.3 rc_MySQL 8.0.3 RC 版即将发布,看看有哪些变化
- 第一章 Python数据模型
- TCP/IP(三):ARP报文格式详解
- 关于C语言的随机函数
- IT人二十年后再定位
- linux引导程序下载,SysLinux 4.05 下载 功能强大的引导加载程序
- 传智杯第四届初赛 B小卡与质数2
- android -chrome 调试
- java 静态抽象类_java--抽象类实例(包含静态内部抽象类)
- 查询商品分类id为10或11的商品对应的商品信息
- 阿里云崩“出圈”了!保护业务还得加一道同云跨可用区容灾!
- 编译原理:LL(1)语法分析器的实现(内含代码详细注释)
热门文章
- node学习篇02-模块机制
- hdu5246 超级赛亚ACMer (百度之星初赛)(模拟)
- 大话日志分析与管理,答题赠书活动
- typedef函数指针使用方法
- 网页制作中的背景处理
- SAP ABAP 点滴记录
- C# .NET Web API 如何自訂 ModelBinder
- python 笔记 之 sqlalchemy操作数据库-说明
- 安全警报:Oracle 2018一月号安全补丁修复由来已久安全漏洞
- 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排...