• 【转载】DNN架构


    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
      {
       USER_CREATED,
       USER_DELETED,
       LOGIN_SUPERUSER,
       LOGIN_SUCCESS,
       LOGIN_FAILURE,
       CACHE_REFRESHED,
       PASSWORD_SENT_SUCCESS,
       PASSWORD_SENT_FAILURE,
       LOG_NOTIFICATION_FAILURE,
       PORTAL_CREATED,
       PORTAL_DELETED,
       TAB_CREATED,
       TAB_UPDATED,
       TAB_DELETED,
       TAB_SENT_TO_RECYCLE_BIN,
       TAB_RESTORED,
       USER_ROLE_CREATED,
       USER_ROLE_DELETED,
       ROLE_CREATED,
       ROLE_UPDATED,
       ROLE_DELETED,
       MODULE_CREATED,
       MODULE_UPDATED,
       MODULE_DELETED,
       MODULE_SENT_TO_RECYCLE_BIN,
       MODULE_RESTORED,
       SCHEDULER_EVENT_STARTED,
       SCHEDULER_EVENT_PROGRESSING,
       SCHEDULER_EVENT_COMPLETED,
       APPLICATION_START,
       APPLICATION_END,
       APPLICATION_SHUTTING_DOWN,
       SCHEDULER_STARTED,
       SCHEDULER_SHUTTING_DOWN,
       SCHEDULER_STOPPED,
       ADMIN_ALERT,
       HOST_ALERT
      }

    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也是很苗条的。

  • 相关阅读:
    经典布局 ---- 双飞翼
    细嚼浏览器兼容----条件注释判断浏览器版本
    webqq的注册登记和聊天页面--运用jsonp跨域
    Bootstrap框架的要点--栅格系统
    html5橡皮檫特效
    PHP正确获取客户端IP地址
    常用排序算法及Java实现
    Math类中的floor、ceil和round方法
    Java中的动态反射机制和动态代理
    测试
  • 原文地址:https://www.cnblogs.com/fx2008/p/2305439.html
Copyright © 2020-2023  润新知