近做项目,使用的是三层架构,在创建数据访问层接口的时候,使用的是反射和缓存机制,但是在运行的时候,总是提示不成功,测试发现反射机制出现问题,没有生成反射对应的类,加载失败,和别人写的代码进行对比,发现代码一模一样,很是崩溃,后来想到是不是配置文件里出现了错误,打开web.config,和别人的进行对比,还是一样的,没有出现错误,但是为什么别人的可以运行,而我的是运行失败呢,后通过网上查找,终于解决了这个问题,原来是因为反射中加载的程序集的名称与程序集在项目中的名称不一致造成的,后修改项目中程序集的属性名称,再次运行,终于成功了!下面对遇到的问题进行简单的总结:

  工厂模式,是类似像工厂生产东西一样的意思。只需得到出厂的东西,具体怎么生产不知道了。拿程序来说,是自己定义一个类,这个类当中会有很多方法,而这些方法是创建对象的作用,用这个类的人只需知道调用哪个方法得到哪个具体对象,至于怎么得到不用管了。

  反射机制,其实也很简单,是一个类,可以利用反射机制得到自己有多少个方法,属性,方法名等等,这时候可以判断这个类有无这个属性,或这个方法。从而调用该方法。

  缓存机制,主要作用是缓存一些数据。在这里不知道他到底有什么作用。但缓存机制是起一个缓存,然后等下次调用的时候直接从缓存中取数据。 这跟你的IE浏览器浏览网页是一个道理的。

  动态创建数据访问层对象,也是创建一些接口来编程了。比较灵活点。具体接口的实现交给工厂模式去实现。

  示例项目DALFactory是采用工厂模式设计的,使用它可以根据需求返回不同的实例对象,在DALFactory项目中使用反射机制来实现依赖注入,当然它的实现还可以更灵活,强大,有兴趣的朋友可以去研究。

  部分代码如下:

  web.config中对应的命名空间值:

<appSettings>
    <add key="SQLDAL" value="Test.DAL"/>
</appSettings>

  利用DAL层工厂模式DALFactory创建DAL接口(下例中是创建了jc_bm数据层接口):

<SPAN style="FONT-FAMILY: simsun">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Test.DAL;
using System.Reflection;

namespace Test.DALFactory
{
    /// <summary>
    /// 操作数据库的工厂类,用于实现IDAL(持久层接口)
    /// </summary>
    public sealed class DataAccess
    {
        private static readonly string AssemblyPath = ConfigurationManager.AppSettings["SQLDAL"];
        private DataAccess() { }
        /// <summary>
        /// 创建对象或从缓存获取
        /// </summary>
        public static object CreateObject(string AssemblyPath, string ClassNamespace)
        {
            object objType = DataCache.GetCache(ClassNamespace);//从缓存读取
            if (objType == null)
            {
                try
                {
                    objType = Assembly.Load(AssemblyPath).CreateInstance(ClassNamespace);//反射创建
                    DataCache.SetCache(ClassNamespace, objType);// 写入缓存
                }
                catch
                { }
            }
            return objType;
        }
        /// <summary>
        /// 创建jc_bm数据层接口
        /// </summary>
        public static Test.IDAL.Ijc_bm Createjc_bm()
        {
          
            string ClassNamespace = AssemblyPath + ".jc_bm";
            object objType = Test.DALFactory.DataAccess.CreateObject(AssemblyPath, ClassNamespace);
            return (Test.IDAL.Ijc_bm)objType;
        }}}</SPAN>

  由这一个类,可以获取需要用的数据访问层的实例,可是,我在使用过程中却总是抛出异常,[System.IO.FileNotFoundException] = {"未能加载文件或程序集“Test.DAL”或它的某一个依赖项。系统找不到指定的文件。":"Test.DAL"} ,再看DAL层在项目集中的名称:

  其中的Assembly name指的是DAL层在项目中的名称,而我们在web.config配置文件中设置的“SQLDAL”的值为"Test.DAL",这两个名字应该是一致的,只有这样反射机制才能在项目中找到需要的类,由于Assembly name我设置的是DAL,所以在反射的时候找不到所需要的类文件,把DAL改为Test.DAL,重新运行成功了。