DotNetNuke初试水之开发和导入一个Module
了解DotNetNuke
DotNetNuke(简称DNN)是一个免费、开源、可扩展、几近完美的内容管理系统。可广泛应用于商务网站、企业内网(Intranet)和外网网站、在线内容发布网站。Dotnetnuke是建立在微软ASP.NET平台之上的一套Web应用框架。Dotnetnuke是微软第一次向开源说"Yes"的里程碑。Dotnetnuke 是门户网站的未来。
历史
2002年1月,微软公司发布了一个名为"IBuySpyPortal(IBS)"的安装工具包,这也是当时罕有的几 个Starter Kits 之一. Starter Kits 是一个所有源代码开放的示例应用程序,它演示如何通过它来实现特殊 的复杂的软件功能.这个工具包非常简单,但却非常完善,并且推崇和吸引程序员们在它的基础之上开发软件项目.
起初,IBuySpy Portal的目的是为了演示,ASP.NET是如何能够构架出一个动态的,数据驱动的门户软件,但是 很快的,微软的 .NET研发中心将IBS变成了为他们自己开发ASP.NET应用程序所必须的一个组件.
2002年12月24日 Perpetual Motion Interactive System公司的Shaun Walker 发布了一个基于IBS的,经过他自己使用VB.NET修改的系统,这个开源 的被称作 IBuySpy WorkShop的软件,很快被链接进了微软官方的ASP.NET论坛. 这套系统在原来IBS基础上,增 加了大量的多样的更加先进的元素,其中包括了它可以在单套程序,单个数据库上上架设多个门户站点.
在IBuySpy WorkShop 圣诞版发布后的几个星期里,成千上万的开发人员下载了这套源程序,并且马上在线建 立了基于这套系统的开发中心.
在随后的几个版本发布以后,这套应用程序被更名为 DotNetNuke。这个名字,选择了DOTNET Framework中的 DotNet,并且结合了单词 Nuke,(意在指出这是一个基于.NETFrameWork的开源的,可用于企业应用的文章管理系统).
今天,DotNetNuke 依然是一个开源的项目.并且拥有为之献身的管理团队,研发中心,在全世界范围内享有 450,000个注册用户
系统架构
系统采用B/S结构,其中服务器端可划分成Web服务器和数据库服务器。服务器端采用面向对象的三层结构,提高了系统的可维护性和扩展性。通过分析DNN架构方式可为我们构建类似项目提供了很好的参考模板。
其中Web 服务器端按逻辑可划分成表示层(Presentation Layer);业务逻辑层(Business Logic Layer);数据访问层(Data Access Layer)
动手实践
从我的个人理解,DNN提供了一个Web网站应该具备的基本功能,内容管理,日志,安全,多语言支持,流行Search功能,皮肤,缓存,异常处理,页面布局(每个控件摆放设置)。
如果用DNN开发一个内容发布的网站,比如公司主页,博客,论坛那么只需要一个美工做几套皮肤就可以搭建一个非常专业的网站。但是我不是做网站的,而是做应用系统的开发,应用系统的开发主要是业务逻辑开发和数据库层的开发。所以说业务层的开发是少不了的。
开发环境
Vs.net 2008 or Vs.net 2005
DotNetNuke_Community_05.01.01_StarterKit.vsi
使用StarterKit可以非常方便创建一个DNN WebSite和DNN模块。
用向导创建第一个DNN模块
第一次开发,所以我选择完全向导的方式进行。功能是对后台数据表YourCompany_MyFirstModule 新增/删除/修改等操作
- 通过向导创建一个webSite(只能使用VB.Net),并且通过向导初始化配置数据库
- 开发第一个模块,使用DNN模块模板
注意:由于DNN的web框架代码使用VB.net的开发,但是在同一个站点下可以使用不同的开发语言,比如我比较擅长C#开发,所以新增的模块我使用C#的模板。
- 修改配置
- 修改模块的目录名称,App_CodeModuleName,DesktopModulesModuleName,改成你的模块名称
- 导入配置
- 使用Host帐号登陆网站,选择模块定义
- 导入配置文件
选择文件
- 加载模块 在首页上面加载刚刚导入的模块
加载第一个模块的首页
向导产生代码结构
DataProvider.cs定义了数据库访问接口
ModuleNameController.cs定义了UI和DataProvider的接口,并且实现了ISearchable, IPortable两个接口,用于网站搜索和模块设置
ModuleNameInfo.cs定义实体对象,用于UI和Controller,Data相互传值
SqlDataProvider.cs具体的数据库访问类(Sql数据库)
App_LocalResources定义多语言支持的资源文件,如果要支持多语言就要创建多个资源文件
Documentation 向导产生的文档
EditModuleName.ascx定义编辑视图下的控件
ModuleName.dnn 导入配置文件
Settings.ascx设定模块配置信息控件
ViewModuleName.ascx定义浏览视图下的控件
开发第二个模块
通过第一个模块,发现了模块间的调用关系还是很简单的。UI->Controller->db,是一种非常简单的MVC架构,甚至说不上MVC,UI层,控制层,数据访问层只是用了一个实体类让数据在三层里面流转。所以向导生成的UI层usercontrol.ascx的后台代码还是很多,并没有切的很干净。
根据平时开发的习惯,我平时做Web应用程序开发框架是UI---〉object DatasourceControl---〉BusinessLayer---〉DataAccessLayer。各层之间使用实体类传递数据;
UI ObjectDatasource可以很好实现和常用的控件进行数据绑定(GridView,FormView,ListView),而且页面后台代码几乎不用写。
DataAccessLayer使用Nhibernate实现,很好支持多种业务数据库和同时很多代码生成器支持代码输出,基本的CRUD操作不需要开发。
BusinessLayer,剩下的就是具体的业务逻辑的实现,我可以完全专著与这一层的开发了。
代码重构
- 生成Nhibernate实体类和Xml文件可以使用CodeSmith或是MyGeneration
- 应用Nhibernate封装好的NHibernate.Repository类库(在Nhibernate实践中有)包括Session管理和CRUD抽象操作。
- 重构向导生成的代码
- 重构DataProvider.cs
具体CRUD操作已经在IRepository中定义了所以在这个业务逻辑接口中指需要定义实际的业务操作接口
- 重构具体的DataProvider,新建一个NHibernateDataProvider.cs
针对DataProvider接口的实现已经在RepositoryBase中实现所以,如果没有其他的操作自然这里没有必要写代码。
- 重构Controller.cs
这里定义的方法就是和UI层具体交互的接口,实现ISearchable,Iportable可以使用空实现
- 重构UI控件 删除原来的View和Edit用户空间,重新创建一个新的相同文件名的控件
直接拖拽一个Gridview ObjectDataSource,通过向导选择Controller的方法;
编辑页面直接拖拽一个FormView ObjectDataSource实现。
编译
导入模块
运行
代码结构
小结
使用DNN开发web应用程序的优势在于再它的框架下开发必须与最小模块来开发而不是Page,所以在很大程度上提高了组件的复用性,灵活性,提高开发效率,规范程序员的代码结构,提高后续的代码的可维护性。 DotNetNuke.rar