分层架构
.NET簡談分層架構思想(徹底分離每個層)
提到分層,我就想起一句圖靈獎獲得者說過的話:計算機科學領域任何問題,都可以間接的通過添加一個中間層來解決;當初看到這句話的時候還不能深刻的體會到這句話的真正靈魂是什么。之所以要寫這篇文章作為技術愛好者之一更愿意與大家分享技術給我們帶來的快樂,本人將從另一個角度來解析.NET分層架構的真正奧秘。分層,一些技術功底比較薄弱的程序員聽到分層就會聯想到三層架構(BLL,DAL之類的),其實不是,分層是一個很大的技術框架思想,三層架構只不過是對普通的信息系統來說,將信息的流轉通過三層來分解,在開發系統時一般總會在解決方案中新建一個Model層、一個BLL層、然后DAL層;其實如果是這樣建項目的話跟一個解決方案中放上一個程序一樣的只不過可以用文件夾分開建立文件是一回事;技術水品的不同對三層的理解各不相同,有時會加上一個接口層讓每層依賴接口來實現,像上面的BLL、DAL之類的架構,只是人為的分解感覺解決方案看上去很清晰一幕了然,對框架來說沒有什么分離作用,還是高耦合低類聚;
在分層架構中,是從總體上對系統進行一個分層,里面涉及縱橫向的概念,一個大的系統從業務邏輯來講可以不是單單的對信息的處理,也可能涉及到對一些其他的邏輯處理,這里就不能單單的把邏輯抽象到三層中,三層是橫向分層中的一個層,如果對分層的焦距拉遠點看是看不到三層的,如果把焦距拉近點看也許目標不會鎖定在信息流的處理子層中,說起來比較抽象來個圖吧;
上圖中將一個大的系統分解為三個業務邏輯塊其實也就是我所說的三個大的層面,我們將焦距拉近看業務邏輯1中的子層;
邏輯1這個大層被分解為兩個子層BLL、和DAL,也就是我們常用的業務邏輯層和數據訪問層;業務邏輯1層中主要是用來對數據庫的增、刪、改、查操作,將其抽象成BLL和DAL也是我們所熟悉的三層;在另外兩個業務邏輯層中一樣可以將其分解層多道子層;將子層分開后就要涉及到具體實現的問題了,就拿C#面向對象語言來將,架構跟思想都是一些方法論的東西,具體實現是少不了的;層是分好了是否在開發過程中真真做到層層隔離,不互相依賴,所以是用接口層分割開來,將具體的實現層脫離開來,我們將BLL層改為BLL接口層BLLI,將DAL層改為DAL接口層DALI,這樣讓BLL、DAL去實現BLLI和DALI接口,完全分離開發,這也是面向對象所提倡的面向接口編程而不是面向實現編程;
以后BLL層出現問題可以完全替換掉換另一個BLL層,DAL層同樣也一樣;但是這是思想性的東西落實到代碼還沒那么簡單:
如:BLLI B=new BLL();//在通常情況下是這樣去用接口的,但是似乎沒有理論說的那么干凈的分離,我們在通過添加一個工廠來實現分離;
這樣在使用時:BLLI B=new BLLI工廠(BLLI接口類型);在調用工廠的時候將接口的類型做為參數傳進去,在工廠中在通過接口類型去查找具體的實現對象;如:
??????? public static T GetInterfaceRealization<T>(Type interfacetype)
??????? {
??????????? Assembly ass = Assembly.LoadFrom("程序集的名稱");
??????????? Type[] asstype = ass.GetTypes();
??????????? if (asstype.Length <= 0)
??????????????? throw new Exception("接口管理器的異常:該程序集沒有任何實現類");
??????????? for (int i = 0; i < asstype.Length; i++)
??????????? {
??????????????? //獲取該實現類的整個繼承鏈中是否有傳入的接口類型;
??????????????? Type oddinterfacetype = asstype[i].GetInterface(interfacetype.Name);
??????????????? if (oddinterfacetype != null)
??????????????? {
??????????????????? T t = (T)System.Activator.CreateInstance(asstype[i]);
??????????????????? return t;//返回動態實例化的接口實現類;
??????????????? }
??????????? }
??????????? throw new Exception("接口管理器的異常:沒有該接口的實現類,必須先實現接口類才能查找");
??????? }
?因為同一個解決方案中的不同項目彼此直接引用時,有利于項目的開發調試,但是我們的BLL和調用方是完全沒有任何依賴的在程序調用時候沒有任何類型的調用所以在解決方案生成的時候不會將我們引用的項目程序集拷貝到執行目錄中,如果想省略手工操作可以在執行查找的時候先調用一下實現層的對象,這樣當編譯生成的時候代碼檢查到你有調用會將你調用的項目程序集拷貝到執行目錄中,在通過接口工廠動態查找時不會失敗;
這樣就徹底的實現層層分離的規則
轉載于:https://www.cnblogs.com/s1297-lgy/p/6639314.html
總結
- 上一篇: 20道你必须要背会的微服务面试题,面试一
- 下一篇: 《武义九州》隐私政策