Put aside the fog and see the essence
解决问题之前,要明白问题为什么会出现
如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案
如果你想明白为什么会出现这个错误
1、首先了解反射的机制
任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll
2、我们来看一下程序的代码和文件
web.config
DalFacoty代码
我们找到web层的bin目录下,查看一下所有的程序集
很容易就会看出来,web下的bin目录并没有DBZQ.Answer.Dal.dll
3、为什么没有DBZQ.Answer.Dal.dll?
我们可以发现web/bin下有很多dll文件,就是没有DBZQ.Answer.Dal.dll文件
为什么?
我们先看看程序中有多少层
然后和dll文件仔细对比一下,发现只有9个dll文件,少了两个(DBZQ.Answer.Test和DBZQ.Answer.Dal)
DBZQ.Answer.Test只是我平时写项目时做测试用的,没有任何层调用了Test层,会不会和引用有关系?
然后我们仔细理一下调用关系
不难发现,web层无论是直接还是间接,都引用了所有层,除了Dal层,这是我们就可以大胆的猜测,可能是引用的关系
会心一笑,这有何难?接下来我就做了一件事
然后重新生成解决方案,打开web/bin
嗯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~????????
看来事情并没有我想的这么简单,还是没有DBZQ.Answer.Dal.dll
呐,为什么其他的层被web层间接引用了可以出现.dll文件??而dal层不行
既然间接引用不行那我们直接引用试一下,先取消Factory层对Dal层的引用
重新生成解决方案
看来还是老大的引用最顶用
那这是为什么呢?为什么间接引用又不行了呢?
仔细思考之下我想到了一个问题,就是我其他的间接引用都是真正的要引用,因为我要用到其他层的函数所以我要引用
并不只是添加一个引用,而是引用加调用
那我们再来尝试一下,先取消web层对dal层的引用
然后同样是工厂类,添加对Dal层的引用,重新生成解决方案
ok,不存在,我们尝试着在DalFactory中声明一个Dal层的对象试一下
重新生成解决方案!!!
果然出现了