这是一个信息管理项目

框架脱胎于PetShop3.0
分为如下几层
Web
BLL
IDAL
Model
DALFactory
NHDAL

根据PetShop3.0的框架:Web层只依赖于BLL和Model,也就是说web层调用BLL层方法返回的Model层定义的数据;BLL层依赖于IDAL,Model,这一层实际是使用IDAL中的方法组合为业务,并处理IDAL层返回的Model;IDAL定义了所有底层方法,给DAL层留下接口;Model定义了对象实体,只有属性没有方法,基本上可以作为抽象类定义。DALFactory的作用是根据配置文件中的设置动态取出取出数据访问层(Data Access Layer)对象的实例,这样做就把实际使用的DAL跟BLL层分离,如果需要切换到其他DAL,只要修改此层就可以了。

本项目使用NH(NHibernate)作为DAl,所以命名为NHDAL。NHDAL依赖于Model,继承Model中属性的定义,并添加了NH需要用到的属性器。同时NHDAL实现IDAL中定义的方法。

下面是对登陆验证和储存日志的实例
先看看IDAL和Model中的定义吧

代码段一 IDAL接口定义

MVC框架示例讲解using System;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.IDAL.Log

代码段二 Model对象定义

MVC框架示例讲解using System;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.Model.Log

然后是BLL中调用。因为BLL不依赖于任何DAL,所以通过中间层DALFactory创建DAL的实例,并通过IDAl定义的接口返回给BLL。

代码段三 BLL方法

MVC框架示例讲解using System;
MVC框架示例讲解
using System.Collections;
MVC框架示例讲解
using System.Web;
MVC框架示例讲解
MVC框架示例讲解
using CManager.Model.Log;
MVC框架示例讲解
using CManager.Model.Collections;
MVC框架示例讲解
using CManager.DALFactory.Log;
MVC框架示例讲解
using CManager.IDAL.Log;
MVC框架示例讲解
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.BLL.Log

代码段四 DALFactory方法

MVC框架示例讲解using System;
MVC框架示例讲解
using CManager.IDAL.Log;
MVC框架示例讲解
using System.Reflection;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.DALFactory.Log
}

代码段五 web.config

MVC框架示例讲解<?xml version="1.0" encoding="utf-8" ?>
MVC框架示例讲解
<configuration>
MVC框架示例讲解    
<!-- 这段大家都熟悉了 -->
MVC框架示例讲解  
<configSections>
MVC框架示例讲解      
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
MVC框架示例讲解  
</configSections>
MVC框架示例讲解  
<nhibernate>
MVC框架示例讲解    
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
MVC框架示例讲解    
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
MVC框架示例讲解    
<add key="hibernate.connection.connection_string" value="server=127.0.0.1;database=CManager;uid=sa;pwd=;" />
MVC框架示例讲解    
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
MVC框架示例讲解    
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
MVC框架示例讲解  
</nhibernate>
MVC框架示例讲解    
<appSettings>
MVC框架示例讲解        
<!-- 默认显示每页显示记录数 -->
MVC框架示例讲解        
<add key="DefaultRecordCount" value="20" />
MVC框架示例讲解        
<!-- *数据库层所在命名空间* 实际使用的DAL在这里设置   -->
MVC框架示例讲解        
<add key="WebDAL" value="CManager.NHDAL" />
MVC框架示例讲解  
</appSettings>
MVC框架示例讲解  
<system.web>
                <!-- 这段按下,不占页面了 -->MVC框架示例讲解   
MVC框架示例讲解 
</system.web>
MVC框架示例讲解
MVC框架示例讲解
</configuration>
MVC框架示例讲解

理论上Web层并不知道IDAL层定义的原子方法,只使用BLL层给出的方法。这就是所谓的业务层与表现层分开。Web层只接受用户发出的请求,然后处理参数交给BLL层,并对BLL层返回的结果进行判断返回给结果

代码段六 Web层调用

MVC框架示例讲解using System;
MVC框架示例讲解
using System.Collections;
MVC框架示例讲解
using System.ComponentModel;
MVC框架示例讲解
using System.Data;
MVC框架示例讲解
using System.Drawing;
MVC框架示例讲解
using System.Web;
MVC框架示例讲解
using System.Web.SessionState;
MVC框架示例讲解
using System.Web.UI;
MVC框架示例讲解
using System.Web.UI.WebControls;
MVC框架示例讲解
using System.Web.UI.HtmlControls;
MVC框架示例讲解
MVC框架示例讲解
using CManager.BLL.Log;
MVC框架示例讲解
using CManager.Model.Log;
MVC框架示例讲解
MVC框架示例讲解
namespace BTTech.CManager.Web

最后是本文的主角NHDAL了,虽然最后出现,却是所有实际操作的最终执行者。

代码段七 实现IDAL

MVC框架示例讲解using System;
MVC框架示例讲解
using NHibernate.Cfg;
MVC框架示例讲解
using NHibernate;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.NHDAL.Log

代码段八 继承Model

MVC框架示例讲解using System;
MVC框架示例讲解
using CManager.Model;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.NHDAL.Log

代码段九 影射文件  SignLogInfo.hbm.xml  这里用到上篇文章《不让NH属性器破坏封装》提到的方法

MVC框架示例讲解<?xml version="1.0" encoding="utf-8" ?>
MVC框架示例讲解
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
MVC框架示例讲解    
<class name="CManager.NHDAL.Log.SignLogInfo, CManager.NHDAL" table="CM_SignLog">
MVC框架示例讲解        
<id name="Id" type="Int32" unsaved-value="0">
MVC框架示例讲解            
<column name="SignLogID" sql-type="int" not-null="true" unique="true" index="PK__CM_SignLog__79A81403"/>
MVC框架示例讲解            
<generator class="native" />
MVC框架示例讲解        
</id>
MVC框架示例讲解        
<property name="NH_UserID" type="String">
MVC框架示例讲解            
<column name="UserID" length="50" sql-type="nvarchar" not-null="true"/>
MVC框架示例讲解        
</property>
MVC框架示例讲解        
<property name="NH_SessionID" type="String">
MVC框架示例讲解            
<column name="SessionID" length="24" sql-type="nvarchar" not-null="true"/>
MVC框架示例讲解        
</property>
MVC框架示例讲解        
<property name="NH_ClientIP" type="String">
MVC框架示例讲解            
<column name="ClientIP" length="20" sql-type="nvarchar" not-null="true"/>
MVC框架示例讲解        
</property>
MVC框架示例讲解        
<property name="NH_SignInDate" type="DateTime">
MVC框架示例讲解            
<column name="SignInDate" sql-type="datetime" not-null="true"/>
MVC框架示例讲解        
</property>
MVC框架示例讲解        
<property name="NH_SignOutDate" type="DateTime">
MVC框架示例讲解            
<column name="SignOutDate" sql-type="datetime" not-null="false"/>
MVC框架示例讲解        
</property>
MVC框架示例讲解    
</class>
MVC框架示例讲解
</hibernate-mapping>

代码段十 小技巧,NHObject基类
定义了一个NHObject的基类,因为任何实际操作对象is a NHObject,所以均继承这个类
这样做的好处是当我们需要更改加载连接字符串方法(比如解密)的时候只需在此出修改,还可以比较大面积地更改NH的使用方法。

MVC框架示例讲解using System;
MVC框架示例讲解
using NHibernate;
MVC框架示例讲解
using NHibernate.Cfg;
MVC框架示例讲解
MVC框架示例讲解
namespace CManager.NHDAL

 这样一个完整的框架就成功地搭建并运行了。:)

相关文章: