应用反射+配置文件+抽象工厂时出现的错误和原因分析

先来看一段程序:

<pre name="code" class="vb">Imports System.Configuration    '配置文件命名空间
Imports System.Reflection       '反射命名空间
Imports IDAL                    '引用接口层

Public Class DataAccess
    '程序集名称(同时代表命名空间名称):DAL
    Private Shared ReadOnly AssemblyName As String = System.Configuration.ConfigurationManager.AppSettings("assname")
    '数据库类型:Sql
    Private Shared ReadOnly db As String = System.Configuration.ConfigurationManager.AppSettings("DB")
    '创建D层类SqlUserInfoDAL的实例
    Public Shared Function CreateUserInfo() As IDAL.IUserInfo
        Dim dalUserInfoName As String = AssemblyName & "." & db & "UserInfoDAL"        '要实例化的D层类的名称
        Return CType(Assembly.Load(AssemblyName).CreateInstance(dalUserInfoName), IUserInfo)
    End Function


对于学过反射+配置文件+抽象工厂实现数据访问的人来说,这小段程序还是很容易理解的。我将这段程序用在了机房收费系统个人重构版中。如图所示:

但是在运行过程中却报了错:

    未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定文件。

通过查资料,知道了一种解决方案:将DAL层的DAL.dll文件复制到UI层相应的目录下,如图所示。

之后,程序正常运行,并通过CreateUserInfo()创建出了SqlUserInfoDAL的实例。

有了成功的经验,我便做了如下操作:

  • 在DAL层,添加了一个新的类:SqlWorkLogDAL
  • 在DataAccess中,添加了一个新的方法:CreateWorkLog()

如下所示:

 '创建D层类SqlWorkLogDAL的实例
    Public Shared Function CreateWorkLog() As IDAL.IWorkLog
        Dim dalWorkLogName As String = AssemblyName & "." & db & "WorkLogDAL"          '要实例化的D层类的名称
        Return CType(Assembly.Load(AssemblyName).CreateInstance(dalWorkLogName), IWorkLog)
    End Function

但是运行后,还是报了错,不过这次错误不一样:

未将对象引用设置到对象的实例。

通过查资料,也找到了答案:修改DAL层--属性--编译--生成输出路径,将生成输出路径改到UI层\bin\Debug文件夹下。

虽然两种解决方法不一样,但是本质都是把DAL层的DAL.dll文件放到UI层

那么,为什么第一种解决方法只有“短暂疗效”,而第二种方法可以“根治”呢?

这时,我做了个尝试,我不去修改路径,而是再次把DAL层中的DAL.dll文件复制并替换我刚才复制到UI层的文件。

结果成功了。

这就说明了:两次复制的文件并非同一个文件,虽然它们都叫DAL.dll,但是在文件内部,它们一定发生了变化。

这里我们就要说说,dll文件是怎么生成的了。

每个程序集下面都有两个文件夹bin和obj,如图:

bin目录用来保存项目生成后程序集,obj目录用来保存编译结果。编译是分模块进行的,编译整个完成后会合并为一个.dll或.exe文件保存到bin目录下。而且采用增量编译的方式。

所以,当我添加了一个新的类SqlWorkLogDAl后,生成的DAL.dll已经不是原来的DAL.dll了。

复制的方式的缺陷在于:只要DAL层发生变化,就得通过手动复制来更新U层的DAL.dll文件。但是修改路径,就不用我们管了,它会自动将最新的DAL.dll文件生成到UI层。

    那么为什么要把D层的.dll文件在U层生成呢?

这就要知道Assembly.Load()是怎么定位程序集了?

当你只给定程序集名称时,如“DAL”,那么CLR只会在应用程序的目录下查找,而咱们的应用程序在UI层,所以要在U层有DAL.dll。

   
问题又来了:

    在U层,有Entity.dll,有BLL.dll,有DataAccess.dll……为什么就是没有DAL.dll,为什么只有它需要修改生成路径?

这里就要看看程序的包图了:

---->代表依赖,也表示引用,那么从UI层看,UI层可以直接或间接地引用Facade层,BLL层,DataAccess层,IDAL层,但是没有引用DAL层,所以别的层的.dll文件会出现在U层,而DAL层的.dll文件没有出现在U层。

文章中,如果有理解得不对的地方,还请大家批评指正。

应用反射+配置文件+抽象工厂时出现的错误和原因分析

时间: 2024-11-07 10:51:28

应用反射+配置文件+抽象工厂时出现的错误和原因分析的相关文章

反射+配置文件+抽象工厂

用反射技术去除Switch或者if,解除简单工厂类的判断语句带来的耦合. 用配置文件全项目替代数据库类型实现Oracle.Mysql,或者加入SqlServer等数据库实现. 优点:比抽象工厂减少耦合(Ifactory,MysqlFactory,OracleFactory变为一个ReflectSqlFactory,而且切换数据库只需要改配置文件)   比简单工厂减少耦合(采用反射技术,减少switch或if 语句) sql.properties db=Mysql ReflectSqlFactor

ADPLUS使用配置文件设置断点时无法创建DUMP文件原因分析

ADPLUS简介 ADPLUS.vbs是Debugging Tool for Windows里带的一个VBS脚本.我们可以用它很方便地生成进程的内存转储文件.从Debugging Tool for Windows版本6.12.2.633后,ADPLUS.vbs被ADPLUS.EXE所替代.原有的VBS脚本更名为adplus_old.vbs. 背景 在一台服务器上,ASP.NET出现随机崩溃的情况.为了解决这个问题,我们决定用ADPLUS收集dump. 我们使用如下配置文件: <ADPlus Ve

一(3)抽象工厂模式&amp;&amp;简单工厂+反射改进抽象工厂

1 抽象工厂? 抽象工厂用在既有产品树,又有产品族的场合. 产品树:奔驰旗下的跑车和商务车构成产品树 产品族:奔驰旗下的跑车与奥迪旗下的跑车构成产品族./*缺点:此时如果需要增加一个红旗厂家的车,需要改的地方很多.1 定义红旗抽象类,具体类:2 Factory接口增加生产红旗的工厂:3 跑车工厂和商务车工厂都需要实现相应的生产红旗的接口.*//* 优点:当需要使用不同产品时,只需要改一行代码 Factory factory = new SprotCarFactory();,即初始化不同的工厂,就

测开之路十八:反射与抽象工厂

反射: hasattr:查看对象里面是否存在某变量 setattr:往对象里面插入变量 delatt:删除对象里面的变量 getattr:获取变量的值 __import__:导入需要的模块,参数必须是字符串,模块必须存在 抽象工厂:抽象工厂一般用于读配置文件去实例化对应的对象 原文地址:https://www.cnblogs.com/zhongyehai/p/10807243.html

泛型、反射和抽象工厂结合解决多DB问题

ueditor集成自己的ImageServer时出现错误的原因分析

1.场景:应用是一个独立的站点,ImageServer是一个独立的站点,因此存在跨域的问题. 2.遇到的详细错误“网络链接错误,请检查配置后重试!” 我使用uploadify测试是没问题的.使用ueditor的upload对话框上传时出现了这个问题,因此我怀疑是跨域文件写法有我问题. 我原来的写法: 经google发现,flashplayer升级到9.124之后,加强了安全性,之前的crossdomain.xml的写法发生了变化,以下就是该文件的新版写法: 加上allow-http-reques

dedecms新建内容模型“把数据保存到数据库附加表时出错‘xxx’出错”错误的原因分析和解决方案(转)

把数据保存到数据库附加表 `bc_addonarticle17` 时出错,请把相关信息提交给DedeCms官方.INSERT INTO `bc_addonarticle17`(aid,typeid,redirecturl,templet,userip,body, ) Values( 11 , 11 , , , 127 0 0 1, )You have an error in your 今天在使用dedecms之梦系统进行建站的时候,使用新创建的自定义内容模型来添加文章的时候出现了错误,错误描述如

join时显示no join predicate原因分析以及解决办法

本位出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据,因为预期很快就可以查询出来结果的SQL,实则半个小时都出不来,后面会有截图 观察执行计划的时候发现中间有一步中出现一个类似如下非常规的连接提示警告,如下图 no join predicate 意思就是没有连接谓词,表之间join的时候没有指定连接谓词可以导致no join predicate, 但是

重构机房收费系统总结1之配置文件+反射+抽象工厂

在重构机房收费系统之前就一直听说这次重构要用反射+配置文件.深远的作用不知道,但是在这次重构用到,目的还是挺明确的:就是为了更换数据时方便,遵循开放-封闭原则,解决了可维护和可扩展的问题. 下面就以机房收费系统登录为例来看看配置文件+反射的用法.机房收费系统登录用到的数据库表是User_info表(用户表).我利用的是三层思想,先看一下我的整体架构! 下面看看配置文件+反射+抽象工厂在登录时访问数据库User表时的用法. 1.先进行配置文件操作 步骤:(1)在VS资源管理器的新建项目UI中,会有