dnn 体系结构
dnn使用三层架构,首先是ascx控件,用于提供用户界面.然后用户界面与业务逻辑层交互,在BLL的下面是抽象数据工厂(Abstract Data Provider),该类提供了一个应用程序的抽象概念.该工厂是与数据库无关的.具体的数据访问层实现相应的抽象方法来完成与具体数据库的交互.
code smith
http://www.ericjsmith.net/codesmith/dnn templates
http://lucaslabs.net/blogs/mccullochs/archive/2004/02/15/487.aspxdnn Data Access Layer 分析
依据80/20原则, DotNetDuke集中力量解决具体应用中的80%的优化目标,并以此来构建数据访问层。
dnn的一个主要需求就是提供一个支持多种数据存储模式的应用。
借助于反射技术来动态加载合适的数据访问对象,dnn使用提供者模式(工厂模式)。具体实现是:先创建一个抽象类,该类包含了所有数据访问对象必须要开放的方法;然后对每种数据库,分别创建一个具体的类,这个类继承了抽象类,实现了相应的数据访问方法。DataProvider类还包含了一个Instance()方法,该方法依据web.config中的指定,在运行时加载合适的程序集就是工厂本身。由于反射很费时,所以需要缓存数据访问类的构造函数。
dnn skinning 方案
dnn使用一个页面(Default.aspx)来显示所有的控件和内容.这样做减少了程序的入口点,就增加了安全性.Default.aspx包含了用于管理页面<head>元素的代码和一个用于注射(inject)皮肤的占位符.当用户第一次访问dnn的时候,检查用户浏览器所发送的URL和请求头,来确定使用哪个皮肤,这需要请求数据库,查看Skins表。确定了所用的皮肤之后,就加载相应的用户控件并注射到页面的占位符上。每个皮肤用户控件都必须引用skin.vb代码文件(存在admin/skins/skin.vb),该文件完成皮肤用于安全管理和内容注射的处理。每个包都至少包含两个皮肤文件,一个定义了公共入口的布局,另一个定义了私有管理区域的布局。前者能在各种面板布局中包含多个内容控件,而后者只能在每个页面的单个面板上包含管理控件。
tab是提供给用户用于完成页面导航的.每个Tab可以包含多个module.可以定义包含多种module control 的module.页面是根据从请求参数中获取的TabID值来进行加载的.
dnn Modules
有很多方法可以创建dnn module,不过我们更倾向于配置一个单独的工程然后单独编译到各自的bin文件夹中.
1 创建一个类工程,给一个有逻辑的名字.不要与其他的module冲突.
2 在创建新工程文件夹的同时,在Root/DesktopModules/下建立一个新的文件夹。
3 去除工程的根命名控件
4 在新工程中添加对于DotNetNuke工程的引用
5 在BuildSupport工程下添加一个对新加项目的引用。这样做能将要build的整个解决方案的dll添加到DotNetNuke工程的bin目录下。
需要为每个新加的模块相应的添加一个数据访问项目。再在DotNetNuke Root/DesktopModules/ModuleName/目录下创建Providers文件夹,然后为每个开发的Provider创建相应的文件夹,如SQLDataProvider。
DotNetNuke自带的一个文档DotNetNuke_ClientAPI-MaxMin的翻译
介绍
DNN的客户端API给开发者提供一个胖客户端的功能集。本文档只是这些功能集中的概要;不依靠 postbacks,能够提供模块的最大化/最小化处理.
目标
交流并且给出关于创建胖客户端功能集步骤的文档。
为最大化/最小化特点内部运转提供一个更好的理解。
显示/隐藏模块的内容
在支持 DHTML 的浏览器中,显示和隐藏模块内容的工作是相当容易的.,如果要决定是否显示或隐藏内容,只需简单地设置style.display里边的属性为空或不设置style.display的属性.触发最大化(显示)/最小化(隐藏)的事件是通过点击"最大化"和"最小化"的一个图片.最后,模块通过利用该模块一个唯一的cookie来保存模块的状态(即模块内容是显示还是隐藏).
处理单击事件
Visibility.ascx 用户控件负责处理显示/隐藏模块内容.该模块的工作主要是检查cookie的值,来决定显示或隐藏内容,同时正确设置最大化/最小化的图片.
这种增加,通过如下的代码,使得先检查浏览器是否支持DHTML:
If ClientAPI.BrowserSupportsFunctionality(ClientAPI.ClientFunctionality.DHTML) Then
如果返回为true,则继续下一步:
通常设置内容显示为true
因为在客户端我们通常需要显示模块的内容
如果内容不需要显示,设置内容展示的样式为空
注册命名空间为dnn.dom的客户端API
ClientAPI.RegisterClientReference(Page, ClientAPI.ClientNamespaceReferences.dnn_dom)
增加客户端image 单击事件
通过如下的代码设置事件处理
cmdVisibility.Attributes.Add("onclick", "if (__dnn_ModuleMaxMin_OnClick(this, '" & _ pnlModuleContent.ClientID & "')) return false;")
Postback代码运行前,这将导致事件的执行。如果返回false,则Postback不再执行,如果max/min正确执行了,我们不再需要返回一个Postback执行,这正是我们想要的答案。相反,如果没有成功执行,则求助于可信赖的postback事件处理。
设置一个代表模块id的button自定义属性,即cookie值
因为客户端负责设置维护模块内容为显示/隐藏状态的cookie。我们需要知道模块的id以正确设置关于模块的cookie。
记录2个关于显示/隐藏图片位置的客户端变量
一个模块可以包括一系列最大化/最小化按纽的图片。因为客户端负责我们所需要的图片的转换,通过方法ClientAPI.RegisterClientVariable这些信息被传递到客户端,在客户端,取得这些变量的值是通过dnn.getVar方法。
用户登陆回车事件
在新的版本中,修改了用户登陆模块。当用户按“回车”时,最大化/最小化按牛将显示。最大化/最小化按纽接受登陆时间。因为最大化/最小化按纽是ImageButton,其HTML表现形式为<INPUT TYPE=”image”.通过HTML说明,这些元素和submit按纽执行同样的操作。因此,可以从回车键中接受动作行为。我的工作就是围绕将
Visibility按纽从ImageButtons转化为一个图片与LinkButton的组合展开的。
如何实现模块间通信
http://sunwangji.cnblogs.com/archive/2005/09/01/228081.htmlDNN调度管理解析(二)-----自定义调度任务
Posted on 2005-09-01 17:27 Baldwin 阅读(485) 评论(0) 编辑 收藏 收藏至365Key 所属分类: DNN核心代码
在前面提到DNN中是可以提供自定义调度服务的,为了在DNN实现自定义调度,
开发者需要创建一个类继承于DotNetNuke.Services.Scheduling.SchedulerClient
(在$DNNNroot/ Providers/Scheduling/子目录下),而且必须提供一个构造函数和
一个DoWork()方法,在构造函数里你可以设置ScheduleHistoryItem为引入的参数;
而在DoWork()方法里你需要把你的逻辑代码包含于Try-Catch捕捉异常代码块中。
解析代码
比如下边提供的一个调度任务,它实现了将所有的日志文件搁放在一个相应的文件
夹里边(我们可设置让该调度程序每天运行一次,而文件夹名称即为该调度任务执
行的日期),这无疑给庞大的日志文件管理提供极大的方便!其中需要注意的就是
DoWork()方法的实现,在这列几点:
1) Me.Progressing 即是告知调度服务任务正在执行,这在运行长期的调
度任务很有用处尽管这是可选的
2) Me.ScheduleHistoryItem.Succeeded = true 即是在任务完成
之后需要赋值在此
3) 如果你需要增加一些信息到调度服务执行历史的话,你需要调用
AddLogNode()方法
4) 必须捕捉错误,如果调度服务出现异常的话