ASP.NET Web Froms开发模式中实现程序集的延迟加载

延迟加载是一个很大的诱惑,可以达到一些比较好的效果,比如:

1、在实体框架中,由于关联数据的数量和使用时机是不确定的,通过延迟加载,仅在使用的时候去执行关联数据的查询操作,减少无谓的数据查询操作,可以降低单次数据查询执行的时间,提升系统的性能。

2、在一个插件平台中启动平台时只加载必需的程序集,当执行到具体插件时再加载插件相关的程序集,仅在需要的时候加载资源,可以减少插件平台的启动时间,使内存的占用更合理些。

延迟加载可以使资源的占用更加合理,并提升一定的性能,当然也有一些例子来说明延迟加载的坏处,这就需要根据实际的情况去考量,不是这篇文章的目的。

 

言归正传,在ASP.NET Web Forms开发模式中,程序集一般都放到bin目录下,或者在web.config中通过配置codebase或者probing节点指定程序集目录,应用程序启动时会从这些位置自动加载程序集。我们要使用延迟加载,就不能将程序集放到这些地方,将需要延迟加载的程序集放到一些有规则可循的目录是一种比较好的方式。比如:

root

|–bin

|–lazyload

|    |–bin1

|    |–bin2

将这些程序集都放到一个lazyload的目录中,然后在其中根据程序集的划分建立不同的子目录,根据需要去不同的目录中加载程序集。

 

那么使用什么方法加载程序集呢?

Assembly类提供了几个静态方法:Load、LoadFile、LoadFrom,可以通过这几个方法将dll文件加载到当前应用程序域的程序集中。

关于这几个方法如何选择,网上有一些总结,这里不做讨论。以下是一些总结:

http://www.cnblogs.com/xuqingfeng/archive/2012/05/22/assembly-load-loadfrom-loadfile-details.html

http://msdn.microsoft.com/zh-cn/library/dd153782(v=vs.110).aspx

 

实现程序集的延迟加载需要扩展两个地方:

1、依赖程序集的延迟加载

通过订阅当前应用程序域的AssemblyResolve事件,应用程序域在加载依赖程序集时如果找不到就会触发这个事件。

在这个事件中我们可以通过一些规则找到需要加载的程序集文件,然后通过Assembly的加载方法加载到内存,并返回。

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
 
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Assembly assembly = null;
 
//加载程序集部分省略
 
return assembly;
}

2、页面动态编译所需程序集的延迟加载

aspx页面在首次访问时会进行编译,编译时需要页面绑定的类所在的程序集。默认情况下这些程序集是在程序启动的时候自动加载的,从.net4开始,微软提供了一个应用程序启动的扩展支持System.Web.PreApplicationStartMethod,也可以在这里通过程序加载程序集,但还是达不到延迟加载的效果。

aspx页面的编译是通过BuildManager实现的,调用BuildManager.AddReferencedAssembly方法可以添加程序集,但是这个方法只能在上边提到的扩展支持中调用,程序启动后再调用就会抛出异常(可能是.net4.0还有些东西没协调好),此路不通。既然不能通过方法添加,那是不是可以直接加入到BuildManager的程序集集合中,很不幸全是私有的,有兴趣的可以自己反编译看看。

私有的其实也不是没有办法可以获取,使用反射,还好BuildManager有一个静态的属性TheBuildManager,通过反射获取这个属性的值就可以得到内部的BuildManager实例,修改程序集的集合就不成问题了。

// 获取BuildManager的实例
PropertyInfo buildmanagerProperty = Type.GetTypeFromHandle(typeof(BuildManager).TypeHandle).GetProperty("TheBuildManager", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetProperty);
BuildManager buildmanager = buildmanagerProperty.GetValue(nullnullas BuildManager;
 
// 获取TopLevelReferencedAssemblies
PropertyInfo topLevelReferencedAssembliesProperty = Type.GetTypeFromHandle(typeof(BuildManager).TypeHandle).GetProperty("TopLevelReferencedAssemblies", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty);
IList assemblies = topLevelReferencedAssembliesProperty.GetValue(buildmanager, nullasIList;
 
// 添加程序集
Assembly assembly = null;
 
//加载程序集部分省略
 
assemblies.Add(assembly);

这段程序要在页面编译之前调用,比如PageHandlerFactory的GetHandler方法中。

 

通过这两个扩展基本上就可以实现程序集的延迟加载了,能用来干什么就要看自己了。博客园有个人搞了个OSGI.NET,就用到文中的两个方法。

当然上边只是初步给出了解决问题的方法,如果要实际使用,可能要考虑更多的问题,比如多线程同步问题、程序集多版本问题等等,有兴趣的可以写写看。

 

本人独立博客地址:http://blog.bossma.cn/dotnet/asp-net-how-to-lazy-load-assembly/

转载请注明出处。

 

转载于:https://www.cnblogs.com/bossma/p/3457903.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的国际化怎么用_Java有关国际化使用实例

1package com.commons.dormant.resources;import java.util.Locale;import java.util.ResourceBundle;/*** Commons-Resources没有提供已经发布的jar包,所以没有相关的实例,* 本例是java自带的和Resources功能相似的例子。主要是实现国际化* author chai…

jQuery之ajax的跨域获取数据

如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。使用这种类型的话,会创建一个查询字符串参数 callback? ,这个参数会加在请求的URL后面。服务器端应当在JSON数…

两个结构体ifconf和ifreq

用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人 来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助 理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考. …

java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思

我有一个关于TCP套接字实现的connect()调用的问题.对于connect()调用来说,非阻塞是什么意思. connect()调用通过发送syn,等待SYNACK然后发送ACK,与其他一些套接字进行三次握手.如果连接成功,connect()调用也返回true,否则返回false.如果调用是非阻塞的,那么我猜这意味着连接应该…

php 换行 PHP_EOL变量

一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,可以是世界是多样的。 本来在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r 因此unix系列用 /n …

alarm项目bug

1. rt5350上运行的soap服务器程序,响应时间过长 原因:打开了soap的调试日志,soap的调试日志是保存的文件中的。所以在rt5350上文件读写速度太慢造成的。因此 在编译的时候不能加-DDEBUG 2. 串口一次read调用读到两帧完整的报文测&#xff0c…

java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?

将Matlab代码转换为Java代码有几个一般的缺陷.我将Matlab转换成C代码,所以我的建议来自于这些经验.>如果你在Matlab中使用for循环,一般来说,你做错了.添加矩阵(图像等)是相当简单的:a b c;不管图像的大小.过滤也是一个相当简单的调用:a imfilter(‘…

C++ 一键关闭屏幕

Demo下载地址&#xff1a;http://pan.baidu.com/s/1vN4wF #include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProc( HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterL…

django 学习 (一)

1. 下载Django 1.3.3 https://pypi.python.org/simple/django/ 2. 验证下载的文件 md5sum 3. 解压安装 python setup.py install 4. 在python的shell里验证是否安装成功 import django 5. 建立第一个django工程 django-admin.py startproject firstproject 6. 修改新建的工…

炸金花比牌规则java_陈陈来给你们炸金花的简易纸牌规则教学与心态指导

原标题&#xff1a;陈陈来给你们炸金花的简易纸牌规则教学与心态指导炸金花是在全国广泛流传的一种4-7人能同时进行的民间纸牌游戏。游戏使用一副扑克牌&#xff0c;去掉大小王&#xff0c;共52张牌&#xff0c;以手中的三张牌比输赢&#xff0c;游戏过程中需要考验玩家的胆略和…

EBS业务学习之应付INVOICE类型

INVOICE类型 类 型 描 述 标准INVOICE 是指由于采购货物或接受劳务&#xff0c;从供应商处取得的INVOICE &#xff08;标准INVOICE&#xff0c;既可以和订单匹配&#xff0c;也可以不匹配&#xff09; 贷项通知单 是指供应商对已开INVOICE的货物或劳务&…

django 学习 (二) 模板

1. 在应用的目录下创建templates目录&#xff0c;并创建一个html文件&#xff0c;比如my.html 2. 修改应用的views.py文件&#xff0c;将my.html文件反馈给请求&#xff0c;有以下几种写法 1) from django.template import loader, Context from django.http import HttpRespo…

简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序

Socket简要阐述Socket的概念Socket的英文原义是“孔”或“插座”。在网络编程中&#xff0c;网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个Socket。Socket套接字是通信的基石&#xff0c;是支持TCP/IP协议的网络通信的基本操作单元…

华为基于策略划分VLAN的配置方法及示例

学过思科交换机的朋友&#xff0c;可能对基于策略划分VLAN的配置方法印象非常深&#xff0c;感觉确实比较复杂&#xff0c;先要配置VMPS以及VMPS数据库&#xff0c;但在华为交换机中&#xff0c;这种现象得到了彻底改变&#xff0c;因为它有了一种特殊的端口类型——Hybrid。说…

django 学习 (三) 模板变量

将views.py中的变量传递给html模板来显示&#xff0c;变量是以字典的形式传递给html模板文件显示的。 模板文件里以字典的{{健名}}来得到健值。 可传递的变量有以下几种形式 1. 基本变量 return render_to_response(index.html, {title:title-django, user:user-django}) 2. 字…

我的世界java刷怪数量_Minecraft我的世界Java版18w16a更新发布

Minecraft我的世界Java版18w16a更新发布&#xff01;Minecraft 1.13 仍未发布&#xff0c;18w16a为其第32个预览版。目前新版本已经基本完成了所有特性&#xff0c;现在更专注于漏洞修复和细节打磨了&#xff01;MINECRAFT SNAPSHOT 18W16AA Minecraft Java Edition snapshotJa…

IOS web app一些实用的属性设置

IOS对safari私有的属性很多&#xff0c;虽然很多不为人知但是却很实用。掌握好这些属性对web app和混合app的开发会很有帮助。 1.format-detection[telephoneno] 是否自动把电话号码转为链接 1<meta name"format-detection" content"telephoneno">IO…

django 学习 (四) 模板标签

模板标签实现html文件中的控制语句&#xff0c;模板标签语句用{% %}形式编写 假如在views.py文件中定义以下内容并传递给模板 my_dic {name:zhang, age:32, sex:male} my_list [aaa,bbb] return render_to_response(index.html, {list:my_list, dic:my_dic}) 下面为模板文…

java构建内存池队列_内存池完整实现代码及一些思考

为了提高效率和有效的监控内存的实时状态&#xff0c;我们采取了内存池的思想来解决效率与对内存实现监控的问题。网上查找到了一些方案&#xff0c;根据自己的理解实现了应用。我们什么时候要调用到内存池&#xff0c;1&#xff0c;当我们频繁的申请释放同样数据大小的内存空间…

Hibernate 第一个体验程序

首先要导入包&#xff0c;将下载的hibernate所有required包导入&#xff0c;将下载的hibernate用来写log的slf4j的api和nopjar包导入&#xff0c;将下载的mysql链接引擎jar包导入。 然后新建java工程。 先告诉hiernate怎么连数据库&#xff1a;在hibernate默认识别目录src根目录…