基于Nhibernate的三层架构分为如下4个模块:
基于Nhibernate的三层架构的优点:
1. 不用手工编写insert、update、delete的SQL脚本。
1. 作为一个框架可扩展性不够强(不想用nhibernate)
实体的操作(EntityControl)代码片段:
//SessionFactory.cs
using NHibernate;
using Model;
namespace DAL
{
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();
}
}
}
}
Session的创建(SessionFactory)代码片段:
//SessionFactory.cs
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace 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();
}
}
}
数据访问层(UserDAL)代码示例:
//UserDAL.cs
using Model;
namespace DAL
{
public class UserDAL
{
private EntityControl control;
public UserDAL()
{
control = EntityControl.CreateEntityControl("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);
}
}
}
配置文件的设置:
//Web.config
<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=saadmin;database=Login"/>
</nhibernate>