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);
        }
    }

  首先是提供一個拓展點,假設我們要實現新聞管理系統的新聞訪問統計插件,那我們要先提供一個可拓展點 代碼如下這是一個頁面的基類,他曝露出了一個靜態的事件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;
         }
     }

 

如果你用的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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章