dnn学习:数据访问(1)
dnn的页面、模块可按照组进行授权,本来想先研究dnn是如何设计权限控制模块的,把权限相关的表结构及关系搞清楚后开始看代码,这一看就钻到数据访问的问题上来了,这一层不弄清楚在其他问题也不容易搞明白,那就从底层的数据访问层开始看吧。
前辈们的早研究过这些问题了,首先就是搜相关的资料,这篇是不能不看的:
DNN 数据访问策略【译】:http://michaelj.cnblogs.com/archive/2005/08/11/212532.html
dnn的数据库访问类运用了Reflection factory 和Singleton 模式,Reflection factory 模式通过反射在应用程序运行时动态的加载正确的(适合的)数据访问对象。
Reflection factory 是这样实现的:先创建一个抽象类,这个类声明了一个方法,这个方法是每一个数据访问类都必须继承实现的。对每一个支持的数据库,创建了一个具体的实现类,这个类实现了抽象类或“协议”中定义的各种数据库操作的代码。为了支持在运行时动态加载具体的操作类,在工厂里实现了一个Instance()方法,这个方法依赖于提供者类从配置文件读取并反射过来的值来决定需要加载哪个程序集。
这几篇文章都不错,推荐一下。
Singleton 模式的介绍 http://www.cnblogs.com/zhenyulu/articles/37246.html
factory模式的介绍 http://www.cnblogs.com/zhenyulu/articles/36590.html
反射工厂介绍 http://www.cnblogs.com/fineboy/archive/2005/08/03/206244.html
在Dataprovider.vb中定义了DataProvider抽象类:包含了DNN的核心框架的数据访问方法。它包含了一个工厂本身的实例方法(Instance()),它负责在运行时动态加载web.config中描述的合适的程序集。例如SqlDataProvider继承了DataProvider,DataProvider中定义了抽象方法在sql server 下的实现。
Dataprovider.vb中对应的关键代码:
Singleton 模式要解决的两个基本问题是全局访问和实例化控制,我对为什么要在这里用Singleton 模式还不理解,有什么好处呢?只产生一个dataprovider实例,对数据库的操作都通过这个实例的方法进行。我能想到的好处是只有一个实例,且该实例为静态的,省内存,效率高。如果有多个实例会出现什么问题呢?希望兄弟们能够指点迷津。
' singleton reference to the instantiated object
Private Shared objProvider As DataProvider = Nothing
'Shared 关键字指示一个或多个被声明的编程元素将被共享。共享元素不关联于某类或结构的特定实例。
'可以通过使用类名或结构名称或者类或结构的特定实例的变量名称限定共享元素来访问它们。
'VB.net中的shared关键字对应着C#的Static关键字
'Singleton 模式解决的两个基本问题:全局访问和实例化控制。
' constructor 静态构造器,在静态字段初始化之前初始化
Shared Sub New()Sub New()
CreateProvider()
End Sub
' dynamically create provider
Private Shared Sub CreateProvider()Sub CreateProvider()
objProvider = CType(Framework.Reflection.CreateObject("data"), DataProvider) '运用反射机制动态创建实际的DataProvider
End Sub
' return the provider
Public Shared Shadows Function Instance()Function Instance() As DataProvider
Return objProvider
End Function
#End Region
其中 objProvider = CType(Framework.Reflection.CreateObject("data"), DataProvider) 调用了DotNetNuke.Framework.Reflection中的方法创建web.config中设定的DataProvider,
Reflection.vb中的相关实现:
关于Activator.CreateInstance:
' dynamically create the object
Return Activator.CreateInstance(CreateType(TypeName, CacheKey, UseCache))
End Function
Reflection.vb 中的CreateType方法实现dataprovider的缓存的管理,反射是比较耗资源的,缓存起来直接返回dataprovider就行了,我发现每次开机后第一次打开dnn首页的时候很慢,大概要十几秒,之后再打开时就很快,应该就跟此类的缓存有关系。
If CacheKey = "" Then
CacheKey = TypeName
End If
Dim objType As Type = Nothing
' use the cache for performance
If UseCache Then
objType = CType(DataCache.GetCache(CacheKey), Type)
End If
' is the type in the cache?
If objType Is Nothing Then
Try
' use reflection to get the type of the class
objType = BuildManager.GetType(TypeName, True, True)
If UseCache Then
' insert the type into the cache
DataCache.SetCache(CacheKey, objType)
End If
Catch exc As Exception
' could not load the type
If Not IgnoreErrors Then
LogException(exc)
End If
End Try
End If
Return objType
End Function
说起来也毕业两三年了,感觉是混了三年,写的代码基本上是拖控件写sql的层次,看了dnn的真的有久旱逢甘露的感觉,老婆说我每天上班对着电脑,回来还盯着看代码,真不明白那有什么好看的也不嫌烦,我只能说我的快乐她不懂!呵呵,又被着睡觉了,哎,怪不得和尚要不结婚呢,有了家就不能安心修行了,哈哈
转载于:https://www.cnblogs.com/mapk/archive/2007/09/19/896404.html
dnn学习:数据访问(1)相关推荐
- DNN 数据访问策略 (转)
经过几天断断续续的努力,这篇文章终于翻译结束,文章主要讲了DNN的数据访问策略,对于了解系统整体上是如何工作的有一定的帮助,希望能给dnn的初学者一些有用的信息.由于翻译的匆忙+水平有限,错误或不当之 ...
- maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...
标签: 本篇内容还是建立在上一篇Java Web学习系列--Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Ja ...
- MVC3学习第六章 排山倒海第二变----使用 Entity Framework Code-First 进行数据访问
本章学习内容 1.Entity Framework 4.1介绍 2.Entity Framework Code-First 进行数据访问 3.利用EF实现用户的增加和列表功能 1.Entity Fra ...
- Spring 4 官方文档学习(十)数据访问之JDBC
说明:未修订版,阅读起来极度困难 1.Spring框架JDBC的介绍 Spring JDBC - who does what? 动作 Spring 你 定义连接参数 是 打开连接 是 指定SQ ...
- 微软企业库5.0学习笔记(三十三)数据访问模块
前言 鉴于企业库5.0已经发布正式版,同时有广大读者的要求(臭屁一下,o(∩_∩)o...),后面文章的内容和代码将基于Enterprise Library5.0和Unity2.0来写,感谢大家的一贯 ...
- Delphi10.4使用FireDAC数据访问组件开发数据库软件学习开发教程(1)
数据库访问是Delphi / C ++ Builder的专长.最新版本的Delphi / C ++ Builder支持使用称为FireDAC的通用数据库访问组件访问各种数据源.因此,在此博客中,我将向 ...
- VB.NET学习笔记:ADO.NET操作ACCESS数据库——ADO.NET数据访问接口
一.ADO.NET概述 Ado.net基于XML和离线计算模型. ADO.net的两个核心组件:.Net数据提供程序.DataSet. .net数据提供程序用来与数据库的连接,如SQLServer.n ...
- Enterprise Library 4 数据访问应用程序块
Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务.应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据.传递数据穿过应用程序层( applicat ...
- 解决 王爽写的汇编语言的第七个验七- 寻址方式在结构化数据访问中的应用
原文: 汇编语言-(第三版) 王爽-著 (实验七) 寻址方式在结构化数据访问中的应用 https://www.52pojie.cn/thread-1241289-1-1.html (出处: 吾爱破解论 ...
最新文章
- 【易创课堂】第2期开课啦,大包新年好礼成都等你
- 【iMX6ULL】触觉 imx6ull开发板交叉编译环境搭建
- shell脚本注意点
- 开窍小老虎,一步一个脚印之 初识汇编(一)
- unittest-常见问题解决方案记录
- 架构设计工作笔记001---智慧城市项目架构设计中应该注意的问题
- 如何释放hdfs中的续租_装修中甲醛如何高效释放
- Android开发笔记(八十八)同步与加锁
- 使用 SpiritManager 类管理在 XNA 游戏中的精灵(十四)
- php返回代码翻译,php 在线翻译函数代码
- 游戏IP手册:游戏IP的内涵元素
- 看你想看的,不受打扰地工作(浏览器屏蔽百度热搜)
- RFID图书馆管理系统的优势有哪些
- Java的JVM,GC是什么?
- Wed前端开发 ---- HTML超文本标记语言
- 新款奔驰S400L改装原厂360全景影像系统,不在担心走向问题
- 给所有的Control加两个属性,实现回车键自动跳转到下一个控件
- win10安装MinGW-64
- 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析
- 关于Mysql 的时区问题
热门文章
- 【Marva Collins' Way】第三章
- 上海——真的可以埋葬一切
- Java动态代理与静态代理
- LeetCode 637. 二叉树的层平均值
- volatile的正确使用姿势
- Mybatis动态sql语句的生成
- kafka拉取mysql数据库_kafka里信息用flink获取后放入mysql
- 如何避免用动态语言的思维写Go代码
- Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)
- ConcurrentProgramming:wait()和notify()和synchronized