zoukankan      html  css  js  c++  java
  • 转:基于NHibernate的三层结构应用程序开发初步

    http://www.cnblogs.com/Terrylee/archive/2006/02/16/331978.html

    本文并不是去详细的介绍如何使用NHibernate,而是通过一个简单的例子来演示基于NHibernate的三层结构应用程序开发过程。关于NHibernate的有关文档,DDL已经做了汉化,但是由于英文文档自身就不完善,所以汉化后也是不全。菩提树在一篇《NHibernate学习之路》随笔中谈到了学习NHibernate遇到的困难,也希望大家把自己在使用NHibernate中的经验和心得能够共享出来,与大家分享。另外我也是刚开始接触NHiernate,有错误之处还请大家指点。

    第一步:准备数据表

    在这里用一个最简单的例子,有一张关于的用户的表,有编号,姓名,密码,Email地址和最后一次的登录时间几个字段。

    Create Table Users(

        LogonID 
    varchar(20Primary 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);

            }


        }


    }

    第八步:实现用户界面

    用户界面很简单,这里就不给出代码了,完成后的用户界面:

    完整代码下载:/Files/Terrylee/NHibernateWebDemo.rar

    Feedback

    # re: 基于NHibernate的三层结构应用程序开发初步  回复   

    2006-02-16 18:11 by 菩提树
    这个,张老三写的那几篇更好,而且他的DOMAINOBJECTCONTROL写的很棒
    提几个小建议:
    1,业务逻辑层是不是该进行一下业务逻辑的判断呀
    例如,ADD一个USER前,是不是该判断是下该USER是不是存在
    USER的各个属性值,是否符合逻辑
    这些都不做的话,这些工作放在哪儿呢?
    DAL仅负责串行化数据以及事务处理,而BAL刚负责业务逻辑,所谓业务逻辑,应该包含这些吧
    最后,一个建议,不要把校验的任务交给DBMS,不要依赖于它的约束等,虽然你写了约束等,但是,不要等在串行化时,才检查数据有效性
  • 相关阅读:
    lnmp环境搭建
    ffmpeg基础使用
    mongodb 副本集搭建
    二 利用pandas统计中国百亿富豪的信息
    1 mongodb安装及启动
    2 mongodb设置密码登录和创建库
    一 pandas读取excle数据
    rancher的使用
    redis主从配置
    redis安装和配置
  • 原文地址:https://www.cnblogs.com/flyfish/p/332082.html
Copyright © 2011-2022 走看看