IOC DI AOP Interception
今天早上Team內部培訓Enterprise Library 中的Unity, 還介紹了IOC & DI & Interception, 下面把這些概念做個梳理.
XXContainer
無論是Spring.Net還是EntLib(Enterprise Library的簡稱)都有一個叫做Container的東西, Spring.Net對應的接口是 IApplicationContext, Unity中的叫做IUnityContainer, 主要做對象的Mapping 任務.
IOC
IOC直譯過來是”控制反轉”,這句話應該理解為什么地方的控制被反轉了?控制的是什么?
這里的控制指的應該是對象的實例化位置由程序內部的硬編碼移動到了程序外部, 實例化的位置做了反向控制.
OjbectA a = new Objecta();
應用了IOC之后就變成了:
IObjectA a = Container.Resolve(“OjbectA”) as IObjectA;
可見這里元被直接new的對象,現在交給了Container來做, 讓后根據Container中的Mapping 來決定用哪個實現來初始化.
DI
“依賴注入”的三種注入方法分別是Constructor Injection,Method Injection, Property Injection. 他是針對面向對象”依賴倒置(DIP)”原則的實現, 其意思是通類內部對外部組件的依賴可以有這三種方式來解除. 此模式也就是要要求當我們的類內部需要對外部組件引用的時候要使用對方的接口或者抽線方法,而不是具體實現類.
AOP
AOP, 面向切面編程,是一種編程方式, 百度文庫的解釋如下:
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。 LINK
主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等。
主要的意圖是:將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改
變這些行為的時候不影響業務邏輯的代碼。
Spring.Net AOP & EntLib Unity均實現了AOP的功能, 常見的方式都必須依賴于接口實現, 也有通過 MarshRefObject TransprentProxy, RealProxy來實現, 還有通過將方法設置為Virtual來實現.
記得還有一個種實現是在IL代碼級別通過Proxy類似的模式實現.
Interception
Interception是EntLib Unity組件對AOP功能的一種實現,
總結
在我們的架構設計中引入IOC的目的就是為了解耦, 面向對象設計原則中有一個”依賴倒置”的原則, 那在這里的IOC框架(Unity, Spring.Net)剛好就是”依賴倒置”原則的一種實現,在這里我們依賴接口編程,在Container中mapping接口與其對應的實現類, 把依賴與實現的編程轉移到了程序外部(在Container里配置).
最終, IOC, DI都是為了解耦而存活著.

浙公網安備 33010602011771號