DNN中,处理Log的类有很多。
一般,捕捉到一个Exception Log的时候,
就会调用ExceptionLogController类,来把该信息封装成一个LogInfo对象,
然后,把这个LogInfo对象存放到全局唯一的对象LoggingProvider中,
具体存放到LoggingProvider对象的什么成员中呢,是存放到LoggingProvider对象的一个LogInfoArray类型的成员中(LogInfoArray本身就是一个LogInfo的集合,而LoggingProvider的作用就是存储这个集合,并提供相关的操作)。
然后,一般通过LogController(ExceptionLogController的父类)来操作LoggingProvider对象,这些操作包括:向LoggingProvider中添加、移出LogInfo对象,取得LogInfo集合等。
整个过程就是:用ExceptionLogController封装Log,并存放到LoggingProvider中,并通过ExceptionLogController来实现对LoggingProvider的操作。
可能Log的信息,多种多样,LogInfo中的单个属性存储不了这么多属性,于是,LogInfo中就有了一个LogProperties类型的成员。该成员是一个集合,存储的是LogDetailInfo类型的对象。LogDetailInfo类型的对象可以理解成一个键值对,即有名称name和值value的对象。
所以,LogInfo是这样组成的:
LogInfo本身存储一些常见的Log属性,例如用户名,Log创建日期等。
LogInfo还有一个集合成员LogProperties,存储的是一些不常用的属性,例如模块编号。这些不常用的属性都封装成LogDetailInfo对象,以利于扩展。
最后,LogInfoArray是一个存储LogInfo的容器,可以随便装入LogInfo对象。
在dnn 系统中,日志可以分为以下集中
1.按照存储方式分为:XMLLoggingProvider 把日志存储在xml的文件中和 DBLoggingProvider把日志存储到数据库里面了
2.从日志的内容上又可以分为:EventLog和ExceptionLog
EventLog,事件日志:记录有关事件的信息,例如 当创建一个用户的时候或用户登陆的时候,都会把相关的信息记录到日志中
ExceptionLog异常日志:根据字面意思,可知,即记录系统异常信息的日志
或许大家会问, 那我怎么知道它在什么时候记录下日志呢,是不是我删除或编辑一条信息系统也会记录下来呢,
这个问题得从事件和异常的分类说起
在dnn中
事件分为 | 异常分为: |
public enum EventLogType |
public enum ExceptionLogType { GENERAL_EXCEPTION, MODULE_LOAD_EXCEPTION, PAGE_LOAD_EXCEPTION, SCHEDULER_EXCEPTION } |
这下大家一看就会一目了然了
贴上log日志中核心类的关系图:
DNN中XXXXControler.vb就是通常说的商业逻辑层,XXXXInfo.vb就是petshop中的module。而XXXXProvider.vb就是数据访问层。
XXXXProvider.vb文件类似于PetShop中的IDAL下面的接口,只不过它是通过Reflection来统一实现实例化,这点要比PetShop方便。
XXXXProvider.vb文件都是抽象函数,所以可以根据配置文件来引用具体的实现类。为在其他项目中引用DotNetNuke提供了方便。
以DotNetNuke.FAQs为例:
DataProvider.vb就是数据访问层对象。
FAQsController.vb是一个商业逻辑对象。
FAQsInfo.vb是自定义业务实体。
而EditFAQs.ascx、FAQs.ascx属于表现层。
其实XXXXProvider.vb类似于petshop下IDAL中的接口.不过XXXXProvider.vb可以通过调用配置文件
和Reflection类来实例化自己.
具体代码:
Private Shared Sub CreateProvider()
objProvider = CType(Framework.Reflection.CreateObject("data", "DotNetNuke.Modules.Events", "DotNetNuke.Modules.Events"), DataProvider)
End Sub
这要比IDAL中的接口方便.
按照这个思路,可以在DNN中找出两大类项目.
一类是实现XXXXProvider.vb抽象类的项目,例如: DotNetNuke.Announcements.SqlDataProvider、
DotNetNuke.Contacts.SqlDataProvider、DotNetNuke.Discussions.SqlDataProvider、DotNetNuke.Documents.SqlDataProvider、
都属于这一类。这一类的特点是一般只有XXXXProvider.vb类,而该类继承自另一个抽象的XXXXProvider.vb类。
另一类就是实现三层模式的项目,例如: DotNetNuke.Announcements、DotNetNuke.Contacts、
DotNetNuke.Discussions、DotNetNuke.Documents、DotNetNuke.Events、DotNetNuke.FAQs、
DotNetNuke.HTML等,都属于这一类。这一类的特点是有XXXXProvider.vb、XXXXControler.vb、,XXXXInfo.vb
三种类,还有几个自定义控件。
我统计了一下,
实现三层模式的项目大约有13个,他们分别是:
1 DotNetNuke.Announcements
2 DotNetNuke.Contacts
3 DotNetNuke.Discussions
4 DotNetNuke.Documents
5 DotNetNuke.Events
6 DotNetNuke.FAQs
7 DotNetNuke.HTML
8 DotNetNuke.Links
9 DotNetNuke.SearchInput
10 DotNetNuke.SearchResults
11 DotNetNuke.Survey
12 DotNetNuke.UserDefinedTable
13 DotNetNuke.UsersOnline
实现XXXXProvider.vb抽象类的项目大约有19个,他们分别是:
1 DotNetNuke.Announcements.SqlDataProvider
2 DotNetNuke.Contacts.SqlDataProvider
3 DotNetNuke.Discussions.SqlDataProvider
4 DotNetNuke.Documents.SqlDataProvider
5 DotNetNuke.Events.SqlDataProvider
6 DotNetNuke.FAQs.SqlDataProvider
7 DotNetNuke.HTML.SqlDataProvider
8 DotNetNuke.Links.SqlDataProvider
9 DotNetNuke.SearchInput.SqlDataProvider
10 DotNetNuke.Survey.SqlDataProvider
11 DotNetNuke.UserDefinedTable.SqlDataProvider
12 DotNetNuke.UsersOnline.SqlDataProvider
13 Provider.DNNScheduler.SQLDataProvider
14 Provider.DNNSQLMembershipProvider
15 Provider.DNNSQLProfileProvider
16 Provider.DNNSQLRoleProvider
17 Provider.Ftb3HtmlEditorProvider
18 Provider.SqlDataProvider
19 Provider.XMLLoggingProvider
这是一份很粗略的统计,没有进行验证,不一定准确。这就是32个项目了.另外,就像那些HttpModule项目,
基本上是实现了一个筛选器.在开始的时候,不一定不许对它进行了解,就像HttpModule.UrlRewrite,
它就是实现了URL的重写,是一个独立的知识点,刚开始,就是不对它进行了解,也构不成什么困惑。
综合以上,说明一个问题:
虽然DNN看起来很庞大,但是有许多项目是类似的。就像以上的两类,我们只要
弄清楚其中的一两个就可以了解其他的了。
所以我们学起来也没有看起来的那么困难。
如果这样给DNN瘦身,DNN也是很苗条的。