DALFactory出现"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .

自己在使用抽象工厂+配置文件+反射实现重构机房的过程中,遇到了这种情况,

 

 

 

当初自己认真的检查了反射中的代码,都是没有问题,请教了师姐,检查了抽象工厂与反射的使用都没有问题

// 查找我们将要使用的数据访问层
private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];

private DataAccess() { }
//实现 CreateCategory 方法,用于创建Supplier类实例
public static IDAL.ISupplier CreateSupplier()
{
    string className = path + ".Supplier";
    //利用反射技术,动态加载指定类型
    return (IDAL.ISupplier)Assembly.Load(path).CreateInstance(className);
}

 

后来在网上找到了类似的问题的解决方案解决了,提示很明显是缺少DLL,原因:

          1:DLL文件名与加载时的DLL文件名不一致。
          2:.DLL文件根本不存在,即出现丢失情况。
         3.:加载DLL路径错误,即DLL文件存在,但加载路径不正确

 

我查了自己项目的情况:
       

    文件名一致,在UI层没有查找到生成的关于D层的Dll文件,程序运行的机制是在启动层的bin文件夹下的debug里面必须得有别的程序集生成的dll文件,程序在运行时会直接在启动的这一层里面直接的调用所需要的dll文件,后来自己把有关的D层生成的dll手动添加了进去,在运行,没有错误了;但是这样还是不行的毕竟后期还需要做大量的工作,总不能每次都需要手动吧,后来才知道原来可以调整程序的生成路径:

 

 

 

     这样对于这个问题就解决掉了,学习到很多知识:

     反射的一个原则:一切皆以UI层的bin文件夹中的dll名称为中心。(原因很简单:.net类加载的机制就是默认从本程序集的bin文件中找,所以bin文件夹中一定要有要加载的程序集的dll)。UI层中bin文件夹中dll叫什么名字AssemblyPath就使用什么名字,bin内部类的全名叫什么,className就写成什么全名。.net中的引用:加入对某个程序集的引用就能在程序集有变化时自动拷贝dll。

 

发现问题:自己搜索的时候还是有些偏差,今后多多锻炼。

 

总结:遇见问题是很正常的,是自己不断前进的阶梯,踏踏实实的解决问题才是最重要的

 

 

后期对反射的思考与学习:

    虽然抽象工厂模式是为解决数据库更换而设计的,但操作不同数据库到底有些什么不同目前尚不十分清楚,除了链接字符串上有区别,还知道Sql Server和Access等在ADO.NET上的使用是不同的,Sql Server用的是System.Data.SqlClient命名空间下的SqlConnection、SqlCommand、SqlParameter、SqlDataAdapter、SqlDataReader等,而Accesss数据库则是用的System.Data.OleDb命名空间下相应的类。此外可能对不同数据库进行操作时SQL语句有些不同吧?!

    对现在正在设计的机房收费系统,如果不同数据库之间的SQL语句没区别,那么现在所写的继承数据表处理接口的数据表处理类就不必在更换数据库时被替换。也就是反射的应用就没有必要了,因为反射在这的作用就是动态的产生数据库处理类(根据条件产生处理Sql Server或其他数据库的处理类,而这些数据库处理类用的就是SQL语句)。

    对这个模式应用的整体感觉是试着应用上了模式来解决数据库更换带来的问题,但究竟解决了没有,解决彻底否尚有很大疑问……

posted on 2016-02-17 16:12  狼来了  阅读(816)  评论(0编辑  收藏  举报