惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
IT之家
IT之家
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
U
Unit 42
罗磊的独立博客
博客园 - Franky
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
P
Palo Alto Networks Blog
F
Fortinet All Blogs
P
Proofpoint News Feed
博客园 - 叶小钗
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
Spread Privacy
Spread Privacy
S
Securelist
C
Cisco Blogs
I
Intezer
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
T
Troy Hunt's Blog
T
Threatpost
博客园 - 司徒正美
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
AWS News Blog
AWS News Blog
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
S
SegmentFault 最新的问题

博客园 - Awen

一些顶级的设计站点(陆续更新) asp.net定时任务实现(原创) Monorail的一些常用的东西(验证码,分页。。。持续更新) 基于Monorail的系统功能模块化 SubSonic:我想要的动态查询 SubSonic:亚音速之光 一个顶N个的NextResult 自娱自乐 3.5 -开篇有益 WinFormUI-Docking初级使用 一个喜欢网页设计的程序员 一个关于Excel的处理类(部分参考网络上) 抛开映射关系,不oo的数据访问写法 Javascript改观过程2 Javascript改观过程1 - Awen - 博客园 CEIMS项目笔记2:重复的,让工具做去! 备份&收集(持续更新)! CEIMS开发日记:项目计划 Jsp,.net! asp.net优化探讨系列(3)
asp.net插件实现
Awen · 2008-11-10 · via 博客园 - Awen

      还记得我在博客园第一篇博客就是学习委托和事件的学习笔记,呵呵,转眼已经在博客园待了一年多了,学到的东西确实是很多,感谢博客园里面辛勤写博的各位,给我们带来了宝贵的学习资料,传递着分享知识和技术的快乐。

      入正题,一直以来我都在寻求基于asp.net的插件的实现方式,有试过动态加载用户控件实现,感觉有些沉重,苦思很久,偶然之间想到了第一篇笔记,原来苦苦得寻求,却在灯火阑珊处,呵呵。其实插件主要是提供可拓展点,其实现实中的需求的插件所要实现的好像也只是拓展操作之前或者操作之后,有点像AOP,那如果程序能提供这些拓展点,插件功能就可以基本实现了!代码实现思路如下:

 1namespace MyPlug
 2{
 3    public class ArticleReadingArg : EventArgs
 4    {
 5        public Article TheArticle get;set;}
 6    }

 7    public class ArticlePage : System.Web.UI.Page
 8    {
 9        public static event EventHandler<ArticleReadingArg> OnReading;
10        protected override void OnInit(EventArgs e)
11        {
12            if (OnReading != null)
13            {
14                OnReading(EventArgs.Empty, new ArticleReadingArg(GetArticle(WebRequest.GetValue("ID"))));
15            }

16            base.OnInit(e);
17        }

18    }

首先是提供一个拓展点,假设我们要实现新闻管理系统的新闻访问统计插件,那我们要先提供一个可拓展点 代码如下这是一个页面的基类,他曝露出了一个静态的事件OnReading提供拓展者订阅页面浏览前的事件,当然,其实Page类也有很多事件可以订阅,不过并没有公开给其他类订阅或调用。好了,弄好这一步,基本条件已经成熟啦,因为外部类可以订阅到Onreading这个事件,并且可以时间的参数是可以访问到相对应的新闻实体,控制权就转移到订阅者手中了。

 1  public class CounterPlug
 2     {
 3         static CounterPlug()
 4         {
 5             if(this.Enable)ArticlePage.OnReading += AddCount;
 6         }
 7         public static void AddCount(object sender, ArticleReadingArg e)
 8         {
 9             e.TheArticle.Hit += 1;
10         }
11     }

 如果你用的asp.net模型是WebSite模型,那么很方便,利用本身带来的动态编译,可以很方便得实现后续的使用和管理,如果不是,可以编译成独立的dll,再利用反射创建实例,这里利用了.net静态初始化函数的特点-只在该类型的某个静态成员第一次被访问或该类型第一次实例化时执行,具体请查看msdn。我们这里用创建实例的形式激活这个静态函数,以达到事件的订阅。我们注意到插件加载是有条件的,这个条件可以根据配置文件,也可以根据数据库数据获取。下面是激活的简单代码,也就是你点击启用之后执行的

 Activator.CreateInstance<MyPlug.CounterPlug>();

 因为创建了一个实例,所以静态函数执行了,事件也被订阅了!所以插件的功能就会执行!

 静态变量的生命周期是随着应用程序的结束而结束的,所以应该不会冒冒然就消失了的。好啦,到这里就实现了插件的启用了,插件的卸载也挺取巧的,本来想到应用程序域这个概念,想想还是不妥,这玩意要一定的信任级别,最后想到webConfig每次修改都会重启应用程序,嘻嘻,这个本来很讨厌的特性,在这里还有得用,关闭插件时修改配置记录问Disenable之外,修改下WebConfig的最后修改时间

string configFile=HttpContext.Current.Server.MapPath("~/Web.config");

            System.IO.File.SetLastAccessTimeUtc(configFile,DateTime.UtcNow);

 可以达到重启的功能,这样实现也有不好的地方,每次插件卸载都要都会引起重新编译,确实不太好,不过系统也不是老是在加载卸载插件,主要是在不修改源代码的前提下进行拓展,目的确实实现了。如果你有更好的插件实现方式,不妨分享一下,期待。。。