使用这套框架不是很长时间。但也基本应用了几个项目中了。在此和大家分享一下我是怎样一步一步搭建此框架的。并为初学者提供一个简单的示范。欢迎共同讨论技术问题。【本人纯属菜鸟!不足之处多谅解!】
第一步:
首先要看一下我项目中三层与mvc以及Spring.Net,Nhibernate处在的哪一层。看下面一幅图:
先做为一个大体的思路和了解。
第二步:
了解Spring.Net做什么用?http://www.springframework.cn/
了解Nhibernate干什么用?http://www.springframework.cn/
了解Asp.Net Mvc :《从零开始学习ASP.NET MVC 1.0》http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/aspnet-mvc-1.html
另外可以看webcast上的视频:老赵的关于Asp.Net Mvc教程!我本人很喜欢。可以用IReaper下载观看。
第三步:
准备:Spring.Net,Nhibernate的开发环境,我的使用的版本比较老,但是一直使用着比较稳定,功能也基本满足开发需要,在此就不多说了,在http://www.springframework.cn/ 有具体版本的下载和文档,读者可以自行下载。
注:VS2008 + sp1 + Asp.Net Mvc 环境都要装上
第四步:
现在我们的环境搭建的差不多了。然后就开始我们的旅程吧。
本篇文章的目的:首先是创建解决方案。并创建相关的项目。先介绍一下项目的各自的作用:
从数据库层到表示层依次为:
数据库层:
1、接口IDao层:IDao
2、Dao层实现:HibernateDao和SqlDao
HibernateDao:由Hibernate实现的IDao部分
SqlDao:是由我们自己写sql实现的部分
业务逻辑层:
1、业务逻辑接口层:IBLL
2、业务逻辑接口的实现:BLL
3、我们把Mvc中的Model放到一个单独的项目中:Model
表示层:
就是我们的web项目。至于你想用Extjs等ui框架,那就是看你的选择了。
现在就开始我们的项目旅程。
第一步:
1、新建一个Web Mvc项目。如图所示:
2、然后依次添加类库项目。最终解决方案如下图所示:
解决方案的框架就基本有型了。不过还只是个空架子。下面我们就开始根据数据库表建立Model
在这说 一下,Model在一般的开发中,我们最好将其映射到表。因为这样一来对应于Nhibernate帮我们实现的面向对象的操作数据库就很好实现了【大家自己去体会】。
第二步:
首先看一下我们书库中的表。我准备了一个User表。下面是建表的sql语句:
CREATE TABLE Hksj_User
(
Id INT IDENTITY(1,1) NOT NULL,
SName NVARCHAR(20) NOT NULL,
SNickName NVARCHAR(20),
SPassWord NVARCHAR(30) NOT NULL,
DCreateDate DATETIME ,
SCreator NVARCHAR(20),
SEmail NVARCHAR(50),
SPhone NVARCHAR(50),
SIdentifyId NVARCHAR(30),
DLastTimeLogOn DATETIME
PRIMARY KEY CLUSTERED
(
Id ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
--添加注释
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'登录名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Hksj_User', @level2type=N'COLUMN',@level2name=N'SName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'邮箱' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Hksj_User', @level2type=N'COLUMN',@level2name=N'SEmail'
数据库截图:
数据库有了,那我们就根据数据库表建立Model模型吧!
在MyWeb.WebTemp.Model中添加类文件:User.cs 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyWeb.WebTemp.Model
{
[Serializable]
public class User
{
/// <summary>
/// 用户id
/// </summary>
public Int32 Id
{
get;
set;
}
/// <summary>
/// 用户名,登录所用的名字
/// </summary>
public string Name
{
get;
set;
}
/// <summary>
/// 真实姓名
/// </summary>
public string NickName
{
get;
set;
}
/// <summary>
/// 密码
/// </summary>
public string PassWord
{
get;
set;
}
/// <summary>
/// 创建日期
/// </summary>
public DateTime CreateTime
{
get;
set;
}
/// <summary>
/// 创建人
/// </summary>
public string Creator
{
get;
set;
}
/// <summary>
/// </summary>
public string Email
{
get;
set;
}
/// <summary>
/// 联系电话
/// </summary>
public string Phone
{
get;
set;
}
/// <summary>
/// 身份证
/// </summary>
public string IdentifyId
{
get;
set;
}
/// <summary>
/// 最后一次登录时间
/// </summary>
public DateTime LastTimeLogOn
{
get;
set;
}
}
}
注:将User设置为public,原因就不用说了【因为在不同的程序集中引用】
本篇是介绍我们完成数据库接口层和业务逻辑层的接口的设计和实现。
废话不多讲,还是怎么一步一步做。
第一步:设计IDao层。在MyWeb.WebTemp.IDao项目中添加IUserDao接口。代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyWeb.WebTemp.Model;
namespace MyWeb.WebTemp.IDao
{
public interface IUserDao
{
/// <summary>
/// 获取所有的用户
/// </summary>
/// <returns></returns>
IList<User> GetAllUsers();
/// <summary>
/// 根据id来获取用户
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
User GetUserById(int Id);
/// <summary>
/// 添加用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool AddUser(User user);
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool UpdateUser(User user);
/// <summary>
/// 更新或者添加用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool AddOrUpdateUser(User user);
/// <summary>
/// 删除用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool DeleteUser(User user);
}
}
注:要添加Model项目的引用。因为我们用到了User实体类。
第二步:实现IDao设计。在MyWeb.WebTemp.HibernateDao项目中添加类文件:UserDaoHibernate.cs
在编写代码之前,我们首先要引入spring.net和Nhibernate的支持类库。我用到的所有dll,稍后将提供下载。如果你急需
可以通过邮件向我索取:malun666@126.com
另外要添加Model项目的引用。因为我们也用到了实体类。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Data.NHibernate.Generic.Support;
using Spring.Data.NHibernate.Generic;
using SpringHiberate.dao.model;
using NHibernate;
using MyWeb.WebTemp.IDao;
namespace MyWeb.WebTemp.HibernateDao
{
public class UserDaoHibernate : HibernateDaoSupport,IUserDao
{
#region IUserDao 成员
public IList<MyWeb.WebTemp.Model.User> GetAllUsers()
{
return HibernateTemplate.LoadAll<MyWeb.WebTemp.Model.User>();
}
public MyWeb.WebTemp.Model.User GetUserById(int Id)
{
return (MyWeb.WebTemp.Model.User)HibernateTemplate.Execute(new HibernateDelegate<MyWeb.WebTemp.Model.User>(delegate(NHibernate.ISession session)
{
StringBuilder sb = new StringBuilder();
sb.Append("from User c where c.Id=?");
IQuery query = session.CreateQuery(sb.ToString());
query.SetParameter(0, Id);
return query.UniqueResult() as MyWeb.WebTemp.Model.User;
}), true);
}
public bool AddUser(MyWeb.WebTemp.Model.User user)
{
if (HibernateTemplate.Save(user) != null)
{
return true;
}
return false;
}
public bool UpdateUser(MyWeb.WebTemp.Model.User user)
{
HibernateTemplate.Update(user);
return true;
}
public bool AddOrUpdateUser(MyWeb.WebTemp.Model.User user)
{
HibernateTemplate.SaveOrUpdate(user);
return true;
}
public bool DeleteUser(MyWeb.WebTemp.Model.User user)
{
HibernateTemplate.Delete(user);
return true;
}
#endregion
}
}
这就实现了数据库接口层的基本的增删改。具体看你的应用,可以根据你的需要添加。
第三步:设计接口IBLL层【业务逻辑接口层】。在MyWeb.WebTemp.IBLL中添加类文件:IUserService
注:添加Model项目的引用。因为这一层我们用到了User实体类。还是看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyWeb.WebTemp.Model;
namespace MyWeb.WebTemp.IBLL
{
public interface IUserService
{
/// <summary>
/// 获取 所有用户信息列表
/// </summary>
/// <returns></returns>
IList<User> GetAllUsers();
/// <summary>
/// 保存用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool UpdateUser(User user);
/// <summary>
/// 删除用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool DeleteUser(User user);
/// <summary>
/// 添加一个用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool AddUser(User user);
/// <summary>
/// 添加或者更新用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
bool UpdateOrAddUser(User user);
/// <summary>
/// 根据id来获取用户信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
User GetUserById(int id);
}
}
第四步:实现IBLL层。【业务逻辑接口的实现】在MyWeb.WebTemp.BLL中添加类文件:UserServiceImpl.cs
注:Impl是实现单词的缩写。同样我们要添加Model项目引用和IUserDao项目的引用。看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyWeb.WebTemp.IBLL;
using MyWeb.WebTemp.IDao;
using MyWeb.WebTemp.Model;
namespace MyWeb.WebTemp.BLL
{
public class UserServiceImpl : IUserService
{
#region 属性
private IUserDao userDao;
public IUserDao UserDao
{
get { return userDao; }
set { userDao = value; }
}
#endregion
#region IUserService 成员
public IList<User> GetAllUsers()
{
return UserDao.GetAllUsers();
}
public bool UpdateUser(User user)
{
return UserDao.UpdateUser(user);
}
public bool DeleteUser(User user)
{
return UserDao.DeleteUser(user);
}
public bool AddUser(User user)
{
return UserDao.AddUser(user);
}
public bool UpdateOrAddUser(User user)
{
return UserDao.AddOrUpdateUser(user);
}
public User GetUserById(int id)
{
return UserDao.GetUserById(id);
}
#endregion
}
}
当前项目的目录结构如图所示:
你的业务逻辑层和数据库接口层实现了吗?
本篇目的:配置Spring.Net和Nhibernate。配置Spring.Net来注入Nhibernate需要的SessionFactory,配置业务逻辑层所需要的Dao层属性的支持。配置这套框架与web程序关联。
在上一篇我们已经将三层基本搭建起来了。这篇中我们将要讲述怎样通过配置,将三层通过IOC注入。现在我们开始我们的旅程:
第一步:配置实体类【Model】对应的数据库映射文件。Nhibernate中要求映射文件必须按照约定的文件命名格式进行命名。至于放到什么项目中都可以,为了便于理解,我们把数据库表和实体类映射文件放到Model项目中。并建立一个专门的文件夹Mappings来存放映射文件。添加实体类映射数据库文件User.hbm.xml。映射文件命名格式:类名.hbm.xml其实就是一个xml文件。下图是项目中的截图:
User.hbm.xml文件代码:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">
<id name="Id" column="Id" type="Int32">
<generator class="native" />
</id>
<property name="Name" column="SName" type="String" length="20" />
<property name="NickName" column="SNickName" type="String" length="20" />
<property name="PassWord" column="SPassWord" type="String" length="30" />
<property name="IdentifyId" column="SIdentifyId" type="String" length="30" />
<property name="Phone" column="SPhone" type="String" length="50" />
<property name="Email" column="SEmail" type="String" length="50" />
<property name="CreateTime" column="DCreateDate" type="DateTime" />
<property name="Creator" column="SCreator" type="String" length="20" />
<property name="LastTimeLogOn" column="DLastTimeLogOn" type="DateTime" />
</class>
</hibernate-mapping>
注意:在User.hbm.xml文件上 右击-->的属性 将[生成操作] 设置为嵌入资源
对于这部分简单说一下,这是我们为Nhibernate操作数据库做铺垫。Nhibernate就是这样要求的。我们按照模板来配置就行了。User.hbm.xml中的配置是根据数据库中的表和我们的实体类User进行对应的。这方面不多讲,可以参考Nhibernate的官方文档。不难,认真看,就能猜出大部分。例如:<property name="Email" column="SEmail" type="String" length="50" /> 意思: property name指的是:User类的属性名字 Email对应数据库的列SEmail 类型是String,长度50个字符。
第二步:配置webconfig!这一步非常关键也很重要。但是基本上就是模板,大家拷贝一下就行了。没什么好说的,注释也很详细。大家看一下,就在几个地方添加就行了。
<!--
Note: As an alternative to hand editing this file you can use the
web admin tool to configure settings for your application. Use
the Website->Asp.Net Configuration option in Visual Studio.
A full list of settings and comments can be found in
machine.config.comments usually located in
\Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
</sectionGroup>
</sectionGroup>
</sectionGroup>
<!--Spring.Net For Log4net -->
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
</sectionGroup>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
</sectionGroup>
<section name="SpringOverrideProperty" type="System.Configuration.NameValueSectionHandler"/>
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
</configSections>
<!--Spring.Net For Log4net -->
<SpringOverrideProperty>
<add key="NamingStrategy.TableHead" value=""/>
<add key="db.datasource" value="server=.;uid=sa;pwd=123;database=HkTemp;"/>
<!-- 0 to 6 (1 Debug 4 Error)-->
<add key="SystemInit.IsDebug" value="true"/>
<add key="SystemInit.Level" value="4"/>
<add key="MappingAssemblies" value="Hksj.HkWeb.HibernateDao,Hksj.HkWeb.HibernateDao"/>
</SpringOverrideProperty>
<log4net debug="true">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="Logs\Application.log.txt"/>
<param name="datePattern" value="MM-dd HH:mm"/>
<param name="AppendToFile" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
<appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs/Log.txt"/>
<param name="AppendToFile" value="true"/>
<param name="MaxSizeRollBackups" value="10"/>
<param name="MaximumFileSize" value="100K"/>
<param name="RollingStyle" value="Size"/>
<param name="StaticLogFileName" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
</parsers>
<context>
<resource uri="~/Configs/CommonDao.xml"/>
<resource uri="~/Configs/HibernateDaos.xml"/>
<resource uri="~/Configs/Services.xml"/>
<!--<resource uri="~/Configs/Webs.xml"/>-->
<resource uri="~/Configs/Controls.xml"/>
</context>
<!--<objects xmlns="http://www.springframework.net"/>-->
</spring>
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<appSettings>
</appSettings>
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<compilation debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/"/>
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear/>
<add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
</namespaces>
</pages>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<!--+++++++++++++++++++++++++spring.net nhibernate++++++++++++++++++++++++-->
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
<!--+++++++++++++++++++++++++spring.net nhibernate++++++++++++++++++++++++-->
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
<add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<!--+++++++++++++++++++++++++spring.net nhibernate++++++++++++++++++++++++-->
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate12"/>
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
<!--+++++++++++++++++++++++++spring.net nhibernate++++++++++++++++++++++++-->
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
<system.web.extensions/>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="ScriptModule"/>
<remove name="UrlRoutingModule"/>
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory"/>
<remove name="ScriptHandlerFactoryAppServices"/>
<remove name="ScriptResource"/>
<remove name="MvcHttpHandler"/>
<remove name="UrlRoutingHandler"/>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</handlers>
</system.webServer>
</configuration>
1、其中这个设置要和你的Nhibernate版本一致。我用的版本比较老。这个一定注意。<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
2、 下面这段的意思是我们在这个地方引入:web网站项目 Configs文件夹下的CommonDao.xml....这几个文件。待会将这几个文件的代码贴出来。
<context>
<resource uri="~/Configs/CommonDao.xml"/> ---用于配置NhibernateSessionFactory,数据库连接等【Nhib核心配置】
<resource uri="~/Configs/HibernateDaos.xml"/>-----配置Dao层所需要的SessionFactory
<resource uri="~/Configs/Services.xml"/> -----配置业务逻辑层所需要的Dao层的支持
<resource uri="~/Configs/Controls.xml"/> -----目前此文件用于Controls的配置注入,暂时不考虑
</context>
3、一一展示在Web网站项目下
我们在web项目根目录下创建文件Configs。并在Configs中添加以上四个xml文件。下面我一一讲述他们的作用。
先看一下目前项目的截图:
(1)CommonDao.xml文件是Nhibernate操作数据库的核心的配置。并配置了可注入到Dao层的SessionFactory。没什么好说的,其实也都是模板。代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database">
<description>
Definitions for the NHibernate Objects.
</description>
<!-- Database and NHibernate Configuration这下面是配置使用Nhibernate -->
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="database=HkTemp;uid=sa;pwd=123;server=.;"/>
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider" />
<property name="MappingAssemblies">
<list>
<!--这是配置嵌入资源的xx类对应的xx.hbm.xml文件所在的项目名称-->
<value>MyWeb.WebTemp.Model</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<entry key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<entry key="show_sql" value="true" />
</dictionary>
</property>
</object>
<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider" />
<property name="sessionFactory" ref="SessionFactory" />
</object>
<object id="TransactionInterceptor" type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">
<property name="TransactionManager" ref="HibernateTransactionManager" />
<property name="TransactionAttributeSource">
<object type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data" />
</property>
</object>
</objects>
注:上面代码中有两个地方需要看一下对应你的项目改一下。一个就是连接字符串。我不用说了。另外一个就是:实体类映射数据库文件hbm.xml文件所在的项目名称一定要配置对了。
(2)HibernateDaos.xml用于配置Dao层的xml文件。这个可以放到CommonDao中,如果系统比较复杂的话,最好单独拿出来放到一个xml文件中,这样比较清晰。还是看代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database">
<object id="UserDao" type="Hksj.HkWeb.HibernateDao.Hibernate.UserDaoHibernate,Hksj.HkWeb.HibernateDao">
<property name="SessionFactory" ref="SessionFactory" />
</object>
</objects>
注:type="MyWeb.WebTemp.HibernateDao.UserDaoHibernate,MyWeb.WebTemp.HibernateDao">
加粗的是Dao层实现类的全名称。后面那个是对应的项目名称【其实是程序集】。看到了我们Dao层配置了SessionFactory。呵呵这里不详细讲。为什么Dao层里面没有属性SessionFactory,但是我们这里配置了呢?呵呵
(3)Services.xml是配置我们的业务逻辑实现类的。看代码:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database">
<object id="UserService" type="MyWeb.WebTemp.BLL.UserServiceImpl,MyWeb.WebTemp.BLL">
<property name="UserDao" ref="UserDao" />
</object>
</objects>
这段代码就是将我们的Dao实体注入给业务逻辑层
到此为止,我们把Spring.Net和Nhibernate的配置基本就搞定了。
这块的配置是够复杂的。不过亲自配置一遍后,熟悉了就没什么的了。
本篇文章:主要介绍怎么使用这套框架。在做好配置等前期工作后。我们就是要与Mvc进行融合了。由于Mvc本人也是个初级入门者。对于这部分的研究还不是很深入。但是基本应用已经可以了。下面就让我们开始一个简单的应用实例吧:
第一步:添加control
在web项目中的controls文件夹下面添加一个UserController.cs文件。【这里可以把Controls单独放到一个项目中,这里只是搭建框架的演示,就不做那么复杂了】
添加代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using Spring.Context.Support;
using MyWeb.WebTemp.IBLL;
namespace MyWeb.WebTemp.Controllers
{
public class UserController : Controller
{
//
// GET: /User/
private IUserService userService;
public IUserService UserService
{
get { return this.userService; }
set { this.userService = value; }
}
public ActionResult Index()
{
var webApplicationContext =
ContextRegistry.GetContext() as WebApplicationContext;
UserService =
webApplicationContext.GetObject("UserService") as IUserService;//从spring配置中获取Userservice
IList<MyWeb.WebTemp.Model.User> users = UserService.GetAllUsers();
ViewData["Users"] = users;
return View("ShowAllUsers");
}
}
}
当然要添加相关的引用。这就不用说了。懂mvc的一看就知道是什么意思。
第二步:添加显示的view
在web项目下的Views文件夹下添加User文件夹。然后添加一个用于显示的ShowAllUsers.aspx view。
view的代码如下:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
ShowAllUsers
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>ShowAllUsers</h2>
<table>
<tr>
<td>用户名</td><td>密码</td>
</tr>
<%IList<MyWeb.WebTemp.Model.User> userList = ViewData["Users"] as List<MyWeb.WebTemp.Model.User>; %>
<%for (int i = 0; i < userList.Count; i++) %>
<%{ %>
<tr>
<td> <%=userList[i].Name%></td>
<td><%=userList[i].PassWord %></td>
</tr>
<%} %>
</table>
</asp:Content>
第三步:在首页中添加一个连接到我们的view
下面是Home文件夹下index.aspx代码:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
Home Page
</asp:Content>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<hr />
<p>
To my page <a href="User/Index" title="ASP.NET MVC Website"> show all users</a>.
</p>
<hr />
</asp:Content>
运行,然后点击连接,最后的效果如下:
点击连接后:
最终我们的结果就是这样子。最后的结果虽然不是很绚丽。但是整个框架已经有了。
项目展望:
我们可以将controls放到一个单独的项目中。然后可以设置一个工厂类来获取业务逻辑层的实体对象。
另外在ui层面我们可以采用extjs等ui框架,让页面更加绚丽。
拓展阅读:Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 1---准备
Extjs学习好去处:
相关下载
项目中用到的:spring.net Nhibernate控件下载
如果在你的项目中,配置的没有报错,但是总是注入进来的都是null的话,可查看配置文件所在的项目是否添加了配置文件中所引用或配置了的项目。还有就是mvc中control中注入都失败了。这个最后还是采用了cs的办法来获取的业务逻辑层的实体类,多少有点遗憾。
下面再回顾一下整个项目搭建的流程:
1、准备开发环境:Spring.Net 、Nhibernate 、Asp.Net Mvc、Vs2008 sp1等
2、创建解决方案,添加Service Dao Model等各个层的项目,准备数据库
3、设计和实现IDao 。在此基础上实现IBLL
4、配置hbm实体类映射xml文件
配置web项目的webconfig文件
配置CommonDao.xml----Nhibernate核心配置文件
配置Dao层注入xml文件
配置BLL层注入xml文件
5、测试使用
这个系列,总算写的差不多了。分享你我的知识,让技术改变世界。系列在不断完善中。。。
希望大家多批评指正!
相关下载
项目中用到的:spring.net Nhibernate控件下载
项目:源代码下载
联系客服