【IT168 技术文档】还记得我在博客园第一篇博客就是学习委托和事件的学习笔记,呵呵,转眼已经在博客园待了一年多了,学到的东西确实是很多,感谢博客园里面辛勤写博的各位,给我们带来了宝贵的学习资料,传递着分享知识和技术的快乐。
入正题,一直以来我都在寻求基于asp.net的插件的实现方式,有试过动态加载用户控件实现,感觉有些沉重,苦思很久,偶然之间想到了第一篇笔记,原来苦苦得寻求,却在灯火阑珊处,呵呵。其实插件主要是提供可拓展点,其实现实中的需求的插件所要实现的好像也只是拓展操作之前或者操作之后,有点像AOP,那如果程序能提供这些拓展点,插件功能就可以基本实现了!代码实现思路如下:
namespace MyPlug
{
public class ArticleReadingArg : EventArgs
{
public Article TheArticle { get;set;}
}
public class ArticlePage : System.Web.UI.Page
{
public static event EventHandler<ArticleReadingArg> OnReading;
protected override void OnInit(EventArgs e)
{
if (OnReading != null)
{
OnReading(EventArgs.Empty, new ArticleReadingArg(GetArticle(WebRequest.GetValue("ID"))));
}
base.OnInit(e);
}
}
{
public class ArticleReadingArg : EventArgs
{
public Article TheArticle { get;set;}
}
public class ArticlePage : System.Web.UI.Page
{
public static event EventHandler<ArticleReadingArg> OnReading;
protected override void OnInit(EventArgs e)
{
if (OnReading != null)
{
OnReading(EventArgs.Empty, new ArticleReadingArg(GetArticle(WebRequest.GetValue("ID"))));
}
base.OnInit(e);
}
}
首先是提供一个拓展点,假设我们要实现新闻管理系统的新闻访问统计插件,那我们要先提供一个可拓展点 代码如下这是一个页面的基类,他曝露出了一个静态的事件OnReading提供拓展者订阅页面浏览前的事件,当然,其实Page类也有很多事件可以订阅,不过并没有公开给其他类订阅或调用。好了,弄好这一步,基本条件已经成熟啦,因为外部类可以订阅到Onreading这个事件,并且可以时间的参数是可以访问到相对应的新闻实体,控制权就转移到订阅者手中了。
public class CounterPlug
{
static CounterPlug()
{
if(this.Enable)ArticlePage.OnReading += AddCount;
}
public static void AddCount(object sender, ArticleReadingArg e)
{
e.TheArticle.Hit += 1;
}
}
{
static CounterPlug()
{
if(this.Enable)ArticlePage.OnReading += AddCount;
}
public static void AddCount(object sender, ArticleReadingArg e)
{
e.TheArticle.Hit += 1;
}
}