【06年博文搬家】使用反射技术动态创建类对象(实例代码)

    经过数天的研究,终于能动态加载数据访问层了。虽然网上有不少介绍反射的文章,但都是从理论上来说的,没有一个特别详细的例子,所以一直没能写出实际代码。这里把自己的一段代码写出来,希望能够帮助像我一样的初学者快速上手,先应用,再深入,免得着急。
    首先说一下基本信息,本例以对数据库中的一个表Sort(类别)的访问为基础。表结构就不说了,而且我也不想涉及到对数据库的具体操作,主要是看一下思路。关于反射的一些概念和基本常识,请参考相关文章,网上有写得非常好的,作者就不班门弄斧了。
    首先创建几个存放类文件的目录:
        IDAL,表示数据访问层接口;
        SQLServerDAL,表示数据访问层,用于操作SQL Server数据库;
        AccessDAL,表示数据访问层,用于操作Access数据库;
        DALFactory,表示数据访问层类的类工厂;
        BLL,表示业务逻辑层;
    然后在各文件夹下建立类,下面是对应的类的代码,命名空间为 “KoalaStudio.BookshopPortal”,这里只保留了最必要的代码。
    (1)首先建立一个数据访问层接口KoalaStudio.BookshopPortal.IDAL.ISort:
    using System;
    using System.Data;
    namespace KoalaStudio.BookshopPortal.IDAL {
        interface ISort {
            DataSet GetList();
        }
    }
    说明:首先定义了一个数据访问层接口,所有的数据访问层类都必须派生于该接口,这样就能对业务逻辑层提供统一的调用方法。
    (2)然后建立数据访问层类KoalaStudio.BookshopPortal.SQLServerDAL.Sort和KoalaStudio.BookshopPortal.AccessDAL.Sort
    using System;
    using System.Data;
    using KoalaStudio.BookshopPortal.IDAL;    
    namespace KoalaStudio.BookshopPortal.SQLServerDAL {
        class Sort : ISort {
        // 得到类别信息列表
            public DataSet GetList() {
                //此处为SQL数据库访问代码,得到的结果作为一个数据集返回
            }
        }
    }
    namespace KoalaStudio.BookshopPortal.AccessDAL {
        class Sort : ISort {
            // 得到类别信息列表
            public DataSet GetList() {
                //此处为Access数据库访问代码,得到的结果作为一个数据集返回
            }
        }
    }
    说明:两个类都派生于ISort,实现的功能相同,不同点就是所操作的数据库不同
    (3)下面就是类工厂的实现
    using System;
    using System.Reflection;
    using KoalaStudio.BookshopPortal.IDAL;
    namespace KoalaStudio.BookshopPortal.DALFactory {
        class Sort {
            public static KoalaStudio.BookshopPortal.IDAL.ISort Create() {
                //后台使用SQL Server数据库
                string className = "KoalaStudio.BookshopPortal.SQLServerDAL.Sort";
                //如果后台使用Access数据库,则写成:
                //string className = "KoalaStudio.BookshopPortal.AccessDAL.Sort";
                Type t = Type.GetType(className);
                return (ISort) Activator.CreateInstance(t);
            }
        }
    }
    说明:首先得到一个字符串,这个字符串就是需要使用的数据访问层类的名称。再实际环境中,需要把这个字符串存储于配置文件中,这样在程序运行时,只要修改了字符串也就修改了程序操作数据库的代码,而不用重新编译。
    “Type t = Type.GetType(className);”根据字符串提供的类名称返回这个类的类型信息,然后用“Activator.CreateInstance(t)”即可将此类实例化。最后用“(ISort)”将得到的实例转换为“KoalaStudio.BookshopPortal.IDAL.ISort”类型。
    (4)最后是KoalaStudio.BookshopPortal.BLL.Sor类
    using System;
    using System.Data;
    using KoalaStudio.BookshopPortal.IDAL;
    namespace KoalaStudio.BookshopPortal.BLL {
        public class Sort {
            // 返回类别名称列表
            public static DataSet GetNameList() {
                ISort sortDal = DALFactory.Sort.Create();
                return sortDal.GetMainList();
            }
        }
    }
    说明:用“ISort sortDal = DALFactory.Sort.Create();”既可直接生成一个数据访问类的实例。在这里,我们不必理会后台是什么数据库,只需要直接使用类工厂给我们提供的数据访问类实例即可。

posted @ 2009-05-23 08:52  行一山人  阅读(627)  评论(4编辑  收藏  举报