代码改变世界

Bugnet学习总结(4)数据访问层

2010-07-25 19:52  MichaelYin  阅读(437)  评论(0编辑  收藏  举报

Bugnet由于功能比较简单,所以在系统的架构上也很简单,没什么过于复杂的地方。

DAL文件夹中的DataFactory文件通过读取Web.config中的Appsetting中的值反射生成生成数据库连接和操作对象。DataHelper,里面则是一些常用的Ado操作,进行了简单的封装,GenericDataAccessLayer是调用DataHelper里的函数完成数据CRUD操作的类。,需要提一下的是具体的数据库操作的代码是写在数据库的存储过程中的,而这一点也正是我不是很理解的地方,先前提到过的DataFactory和DataHelper特别是 DataFactory的存在是提供跨库操作的,而它将数据库操作又用存储过程写在数据库里面这不是有点矛盾么。。。想象一下如果要迁移的话那存储过程不是都还要改。。。。。:(

在看GenericDataAccessLayer的时候,刚开始我对其中一个语法结构不是很清楚,是到网上查了一些资料才弄懂的。该类在里面定义了一个静态对象,如果是别的对象我还可以理解,可是这个对象正式通过GenericDataAccessLayer实例化的。。

	/// <summary>
	/// BugNET Data Access Layer
	/// </summary>
	public class GenericDataAccessLayer
	{
        private static GenericDataAccessLayer instance;

这个就是静态对象声明的地方

        /// <summary>
        /// Instances this instance.
        /// </summary>
        /// <returns></returns>
        public static GenericDataAccessLayer Instance()
        {
            if (instance == null)
            {
                instance = new GenericDataAccessLayer();
            }
            return instance;
        }

在调用的时候如果为null会对对象进行初始化。

刚开始我的想法是GenericDataAccessLayer里包含instance这个对象,那初始化的时候会构成一个不断递归的过程,为什么会编译通过呢?后来在网上找了一下,找到了答案。原来类里面定义的静态对象是在类级别而不是在对象级别的。如果那种写法不是写的静态对象,即语句写成了public GenericDataAccessLayer Instance() ,那么肯定是有问题的,而如果你写在类这个级别的时候这个问题是不存在的。

这样来说吧,假设你用GenericDataAccessLayer来初始化一个对象,就像上面那个函数里面写的那样

GenericDataAccessLayer objGenericDataAccessLayer  = new GenericDataAccessLayer ();

objGenericDataAccessLayer 这个对象在初始化的时候只会为类里非static的变量分配内存空间,static因为前面已经说到时在类这个级别,所以不会对它进行空间分配,也不会出现我刚开始所担心的递归问题。

当然了,其实代码中并GenericDataAccessLayer objGenericDataAccessLayer = new GenericDataAccessLayer ();这样的代码,除了初始化那个instance外,调用的代码一般写的是

 int TempId = GenericDataAccessLayer.Instance().CreateNewHistory(this);

像这样的代码,我不明白的就是为什么不直接用工具类调用静态函数来写,还要在中间加一个Instance不知道这是什么意思。。望知道的朋友留言告知。

数据访问就写到这了,下次写BLL.