DotNet企業級架構實戰之1——框架綜述

spring.net是java下大名鼎鼎的spring框架移植到.net的開源項目,且藉助於.net強大的反射機制,甚至擁有比原java版本更強大的功能。

那它能用來做什麼呢?核心功能就是IOC和AOP:

IOC(Inversion of Control),字面意思爲“反轉控制”,我更傾向於理解爲“依賴注入”,意思就是說:在基於接口開發的情況下,我們會對需要的業務處理對象(數據訪問,業務邏輯等)一一做上接口,前端使用時只是對接口的調用,而並不關心具體是什麼類具體去實現了這個接口~聽起來似乎不可能,是的,如果沒有IOC,這是不可能的事情,我們的前端邏輯和後端實現是緊緊耦合的,做頁面開發的人必須知道哪一個類(.cs文件)擁有哪些方法,即便是基於接口,我們也依然要在程序裏去實例化它,形如:


IManager mgr = new DataManager();

無形中,基於接口開發成了雞肋,前端開發人員幾乎要知道一條龍的編碼流程才能做業務開發!(當然,有的項目就是一個人在做)

好吧,那就使用IOC,它是怎麼解開這個耦合關係的?

IOC框架一般會維護一個配置文件,它大概要完成的使命是:

1、將實現接口的對象進行列表,表示它們是被頁面需要的;

2、把頁面的以基於URL的形式進行列表,表示它們是需求方。

餘下的事情,是框架來進行協調,在頁面上聲明一下某一個接口的對象,在它需要實例化時,IOC框架會自動將對應的接口實現進行注入。如下就是一個Spring.net的配置範例片斷:


  〈!--業務相關-->
  
〈object id="ArtistDaoSpring" type="woodigg.DAO.ArtistDaoSpring,woodigg.DAO" autowire="byName" />

  
〈!--頁面調用-->
  
〈object type="~/Admin/Artist/MgrArt.aspx" autowire="byName" />

再看看頁面裏的聲明和調用片斷:


using  System;
using
 System.Data;
using
 System.Configuration;
using
 System.Collections.Generic;
using
 System.Web;
using
 System.Web.Security;
using
 System.Web.UI;
using
 System.Web.UI.WebControls;
using
 System.Web.UI.WebControls.WebParts;
using
 System.Web.UI.HtmlControls;
using
 System.Text;
using
 woodigg.model;
using
 woodigg.Interface.DAO;
using
 woodigg.bll.Tool;
using
 Spring.Context;
using
 Spring.Context.Support;

public partial class
 Admin_Artist_MgrArt : AdminPage
{
    #region 注入對象

    
private  IArtistDAO _ArtistDaoSpring;
    public
 IArtistDAO ArtistDaoSpring
    {
        get { return
 _ArtistDaoSpring; }
        set { _ArtistDaoSpring =
 value; }
    }
    #endregion


    
protected void Page_Load(object  sender, EventArgs e)
    {
       GridView1.DataSource =
ArtistDaoSpring.GetAllArtists();
       GridView1.DataBind();
    }
}

如果是初次接觸IOC,可能理解起來會有些生澀,畢竟是個基於配置的框架,有些東西需要深入瞭解,這個以後可以一步步探個究竟。OK,接着就是AOP。

那麼AOP又是做什麼的呢?Aspect Oriented Programming,字面意思即爲“面向切面的編程”。Aspect,就是切面,代表了我們很多項目中重複開發的模塊,如郵件功能,日誌功能等。

說起來是會讓人很頹廢的,我們花費在重複勞動上的時間,有時太多了。這個項目寫日誌,下一個還寫日誌,日誌有區別嗎?答案是沒有,但它就是需要,哪怕是複製粘貼,還是需要!被需要當然是好事,說明它存在的價值,但能否把這樣的東西做成一個組件,以後拿來就用,並且與新的項目系統人我兩不犯,無縫集成?

當然是可以的,AOP在此時的價值會得到充分的體現。就我個人而言,對它的理解,更多的是一個監聽器,偵測你的業務是否有相關的需要,只要你有需要發出,AOP框架就會在你需要的地方設一個斷點,進行功能模塊的切入,讓它去做你希望它做的事。就這麼神奇~

這裏放出一個代碼片斷,小小注解一下以上比較讓人頭暈的概念:

Code

這一代碼片斷實現的功能是:如果發現系統中新增了一個用戶(即User的業務管理器調用了Save方法),那麼在日誌系統中,存儲一下用戶名,讓管理員可以在翻日誌時知道誰又加入了~

當然,就這麼一段代碼並不能完成這個監控功能,同樣的,我們必須做配置(Spring.net把開發提高到了對配置進行管理的境地,你在配置管理上花的時間,將大於以往,好處是更關注和貼近業務而不是代碼),告訴AOP框架,我們希望監聽哪些對象的哪些動作,以及監聽到後我們要調用哪些模塊來採取行動:

Code

也許這樣的配置片斷更讓人犯暈,沒關係,習慣了就好,有些事情需要我們自己去做(DB,ENTITY,DAO,BLL開發),有些事情需要的是我們去理解(AOP框架,通知,切面,代理對象),相信不需要多長時間,這些都不是問題。

關於IOC和AOP,以上只是寥寥幾筆帶過,在以後的實例系列中,將各個擊破

實例主要圍繞的是一個音樂網站的搭建(有點兒像AllMusic內樣的,而不同於別的什麼無聊SNS社區),會涉及的內容是:Spring.net、nHibernate、codeSmith模板、多對多表結構、Castle MonoRail(雖然有人強建不建議把MonoRail集成到Spring.net中,但我至今沒找到.net 2.0下好的MVC解決方案,用用MonoRail有助於更好理解MVC,優化性能)。

 

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