.net关于反射加载机制问题

太忙太懒,写博客的时间少了很多

最近使用ORM,里面使用大量的反射,其中有一个需求,就是需要在程序启动时,将所有数据库实体类注册到容器,方便后续调用。

使用的框架是MVC,所在把初始化的入口放到了 Global.asax里面的 Application_Start()

项目比较大,分了好几个工程,如Web,Core,Common,Biz......等等

而数据库实体,也散落分布到各个项目里面,其中主项目Web引用了另外几个辅助项目。

发布的时候,项目正常运行,一切看起来都很美好。

后来,有需求变更,改了一下web.config配置文件,项目就出现了奇怪的事情,提示某些实体类没有初始化到容器。

注意,只是部分实体类没有注册,而这些没有注册的实体类都是其他辅助项目,主项目Web下的实体类全部正常。

当时重启了应用程序池,又正常运行了,后来反复试了几次调整web.config,在不重启应用程序池的情况下,均出现相同情况。

终于在vs的调试下,找到了问题所在。

原来是这里出了问题  AppDomain.CurrentDomain.GetAssemblies() 

这句代码是拿当前应用程序域里面所有的程序集,然后再遍历各程序集,找到继承于EntityBase的全部实体类。

在程序第一次启动的时候,这句代码可以拿到bin目录以及sdk的所有程序集

但当修改web.config时,却只能加载部分程序集,从而导致某些项目.dll(程序集)的实体类没有注册到。

网上搜索了很久,均没有关于修改web.config时,应用程序集重新加载的原理解析

在几经调试下,发现只要在 Application_Start() 中引用了其他程序集的类或方法,该程序集就可以被加载到

这似乎也很合逻辑,按需加载,毕竟一个项目那么多程序集,全部加载,影响速度

但为什么项目第一次运行的时候,又全部加载呢?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值