MVC架構理解

     在學習Web程序設計時,總是會遇到MVC這種架構,它是一種將程序分爲至少包含M(模型)、V(視圖)、C(控制器)三個層次結構的設計方法。MVC很早就出現了,它是人們關於程序設計的經驗的總結,能夠在程序設計時做到關注分離,即不同的模塊只關注應用的一個部分,它們之間通過接口進行鬆散耦合,使得我們可以很方便的進行模塊化程序設計。
    模型(M),是整個架構中最重要的部分,因爲它代表着應用的域環境,我覺得它應該是程序真正關心並需要實現的業務邏輯部分。在設計開始時,總是要進行需求分析和提煉,這時候就會出現很多業務域的對象、過程、關係等,這些就是模型的初始狀態。在域模型中,我們只關心與業務邏輯有關的屬性和操作,並定義與之有關的對象和接口,其他非相關操作,如數據持久化等,都通過接口調用其他模塊的實現完成。這裏以一個商店的例子開始,第一個相關的域對象肯定是商品,因此需要定義一個域對象Product:
    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
    爲了能夠操作這個Product對象,需要定義與之相關的接口,描述出相關的業務邏輯,如取出所有商品、刪除商品等:
    public interface IProduct
    {
        IList<Product> GetProducts(int count);
        void RemoveProduct(int productID);
    }
    這裏之所以定義接口而非對象,是因爲它將與其他模塊進行交互,而它的業務邏輯可能有不同的實現,因此採用接口與實現分離的方法。
    控制器(C),是整個架構中的樞紐,它負責從視圖接收請求,並調用模型獲取響應,之後返回新的視圖給用戶。控制器絕不應該處理有關業務邏輯的問題,它分析用戶的請求,組合不同的模塊,如用戶需要顯示商品列表時,它會生成IProduct的實例,並告訴它從哪(持久化接口)可以讀到商品數據。通常,模型中只通過接口操作數據的讀寫,不關心何種實現,這時,就需要控制器去生成相關的數據操作接口(如數據庫)實例並傳給模型實例。從模型中獲取數據後,控制器也不會執行與視圖顯示有關的操作,它應該簡單的組織一下數據,如排序、選擇、排除等,然後將數據直接傳遞給視圖模塊。定義控制器如下:
    public interface IProductController
    {
        // 按頁讀取數據
        IList<Product> GetProducts(int currentPage, int pageSize);
        // 搜索數據
        IList<Product> SearchProducts(string keyword);
    }
    控制器接口中的方法可能跟模型中導出的方法相同,但是它們的作用不一樣的,服務的對象也是不同的。模型中可能只是簡單的讀取數據,也可能需要進行業務邏輯處理,而控制器則是在模型返回的業務數據的基礎選擇滿足用戶需求的數據,或者什麼都不做。
    視圖(V),是整個架構中唯一和用戶進行交互的部分,接收用戶事件,顯示相關數據。通過MVC將應用進行劃分後,視圖只通過接口和控制器進行交互,沒有任何業務邏輯、數據存取邏輯,因此UI人員可以獨立、高效地開發出滿足用戶需求的UI,而不用擔心變化導致的更改。
    爲了更好的實現MVC架構,還需要一個數據訪問層,它屏蔽控制層、模型層對底層數據操作的變化修改。可能還會用到其他相關的設計模式,如使用工廠模式創建各個接口的具體實現,從而使需要接口的地方不需要關心如何創建實例,以及使用依賴注入模式,將模型對數據訪問層的依賴性由模型的構造函數傳入,即在創建模型實例時指定數據訪問接口的實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章