vb.net反射机制
再次做机房收费系统出了点小状况,当运用反射机制生成D层类的对象的时候无法获取到类文件,代码如下,而相同的代码在第一次做机房收费系统的时候并没有报错.
Public Class DataAccess '从配置文件获取响应数据库的的字符串这里是sql ReadOnly db As String =System.Configuration.ConfigurationManager.AppSettings("DB") '这里定义的是程序集的名称 ReadOnly AssemblyName As String = "DAL" ''' <summary> ''' 创建基本数据接口 ''' </summary> Public Function CreateIBasicData() AsIBasicData '动态的得到要实例化类的名称 Dim className As String =AssemblyName + "." + db + "BasicDataDAL" '用反射机制生成要要创建的类 Dim CreateUserInfoServers As IBasicData = CType(Assembly.Load(AssemblyName).CreateInstance(className), IBasicData) '返回创建成功的类 CreateIBasicData =CreateUserInfoServers End Function End Class
最后几经波折终于找到了问题所在,不过先不揭晓,继续往下看
问题的出现还是因为对Assembly这个类了解的不是很清楚.第一次做机房的时候只是知道这个类就是反射相关生成类的实例用的.这种比较浅的认识导致了错误的产生.
在反射机制中Assembly类可以获得正在运行的程序集的信息,并且可以动态的加载程序集,而且在程序集中查找类的信息,并创建该类型的实例。当然这种动态生成的好处不言而喻,他带来了更大的灵活性,但同样的更加耗费资源.如果衡量使用还看程序员的理解与习惯.
知道了assembly类的作用问题差不多也暴露出来了,Assembly.Load(AssemblyName)这个方法是动态加载程序集,.CreateInstance(className)方法则是创建类的实例,问题就出在这个className,这里className的生成用的是(程序集名.类名),这很明显有问题,因为我们平时用的寻找累的方式是(命名空间.类名).自然动态生成的时候找不到类.而上一次做机房收费系统的时候没报错的原因则是默认使用的命名空间和程序集相同的名字.迷迷糊糊的也就运行通过了.
说道这里不得不说说"命名空间"和"程序集"这对让人费解,又不得不弄明白的概念了.
命名空间
命名空间类似与包,这里出现问题也恰恰是因为这里类库文件是UML软件自动生成的,而命名空间的生成源于包图的层次关系.
程序集
程序集是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是程序集。
而程序集和命名空间的关系不一定是一一对应,也不互相包含,一个程序集里面可以有多个命名空间,一个命名空间也可以在多个程序集中存在
举个例子:
命名空间只是说明一个类型是哪个族的,比如有人是汉族、有人是回族;而程序集表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。
很自然的了解了这些以后问题得到了解决如下:
Public Class DataAccess '从配置文件获取响应数据库的的字符串这里是sql ReadOnly db As String =System.Configuration.ConfigurationManager.AppSettings("DB") '这里定义的是程序集的名称 ReadOnly AssemblyName As String = "DAL" '这里来获取类所在的命名空间名称 ReadOnly spaceName As String ="UseCaseModel.Package.DAL" ''' <summary> ''' 创建基本数据接口 ''' </summary> Public Function CreateIBasicData() AsIBasicData '动态的得到要实例化类的名称 Dim className As String = spaceName + "." + db +"BasicDataDAL" '用反射机制生成要要创建的类 Dim CreateUserInfoServers AsIBasicData = CType(Assembly.Load(AssemblyName).CreateInstance(className), IBasicData) '返回创建成功的类 CreateIBasicData =CreateUserInfoServers End Function End Class