一.基本步驟:
1.設計適合控制反轉(IoC)的應用程序
2.給應用程序Autofac 引用.
3.注冊組件.
4.創建一個Container以備後用.
5.從Container創建一個 lifetime scope .
6.使用這個Lifetime Scope 來解析組件的實例.
二.詳細介紹:
1.什麼是控制反轉?
控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題。 控制反轉還有一個名字叫做依賴注入(Dependency Injection)。簡稱DI。IoC就是IoC,不是什麼技術,與GoF一樣,是一種 設計模式。
Interface Driven Design接口驅動,接口驅動有很多好處,可以提供不同靈活的子類實現,增加代碼穩定和健壯性等等,但是接口一定是需要實現的,也就是如下語句遲早要執行:AInterface a = new AInterfaceImp(); 這樣一來,耦合關系就產生了;而采用了IoC之後,我們的就把創建接口的一個實例交給IoC容器.從而實現了解耦.
所以我們在編程的時候的原則之一就是"針對接口編程",這裡的"接口"不是指一要是個接口類型,它可以是C#語言中的接口類型,也可以一個具體的父類.
public interface ILcService { string ServiceName { get; } } public class LcService:ILcService { public string ServiceName { get; set; } }
2.怎麼添加Autofac的引用?
1)我們可以到Autofac官網下載dll文件,然後在Visualstudio的項目中添加引用
2)也可以使用NuGet 安裝autofac包.
3.怎樣注冊組件?
在Autofac中,我們使用一個ContainerBuilder類的實例來注冊我們的我們的組件. Autofac提供了Register方法家族,方便我們注冊組件.
ContainerBuilder builder = new ContainerBuilder(); builder.RegisterType<ILcService>().As<LcService>().InstancePerDependency();
4.創建一個Container以備後用.
直接調用ContainerBuilder類實例的build()即可.
var container = builder.Build();
5.創建一個Lifetime Sope.
var lifetimescope = container.BeginLifetimeScope();
6.得到我們需要的的實例.
ILcService service = lifetimeScope.Resolve<ILcService>();
我們可以在最後看的出來,使用了IoC之後,就符合設計模式中要求的"針對接口編程,不針對實現編程";創建實例不是使用New關鍵字創建,而是創建實例的工作交給了IoC容器,這就實現了關系解耦,可以在IoC容器中隨便的替換具體的實現類了.
還有個問題就是"為什麼不直接從Container中直接解析出具體的實例,而要創建一個LifetimeScope,再從它裡面解析?"
這個就是考慮到內存洩露問題. LifetimeScope用完了,就釋放了,它裡面的實例也跟著釋放了,就不會出現內存洩露,Container是個root ,永遠不會釋放,如果他裡面存在實例.就有可能存在內存洩露問題.
不知道你是怎麼理解的?
我沒仔細看過Spring的實現,但是個人理解容器不需要生成代理呀,只要將依賴注入進去就好了,不需要額外的訪問控制之類
我們在做著表面上看似是對於各種不同應用的開發,其實背後所對應的架構設計都是相對穩定的。在一個好的架構下編程,不僅對於開發人員是一件賞心悅目的事情,更重要的是軟件能夠表現出一個健康的姿態;而架構設計的不合理,不僅讓開發人員受苦受難,軟件本身的生命周期更是受到嚴重威脅。這裡我將針對在微軟dotNet平台上做應用開發的系統架構設計做一個粗淺的討論。
總體設計
表示層
表示層由UI(User Interface)和UI控制邏輯組成。
UI(User Interface)
UI是客戶端的用戶界面,負責從用戶方接收命令,請求,數據,傳遞給業務層處理,然後將結果呈現出來。根據客戶端的不同我們大體將應用程序分為BS(Browser-Server) 浏覽器結構,CS(Client-Server)桌面客戶端結構。
BS的優點是無需操心客戶端,只需要部署維護好服務器即可。CS的優點在於強大的界面交互表達能力。RIA(Rich Internet Application)是為了融合這兩種結構優點的一種技術,它依賴在客戶端一次性安裝一個通用解釋器之後即獲得強大的界面交互表達能力和無需部署具體客戶端的方便性。具體的實現技術很多,例如微軟的SmartClient, Avalon; Macromedia的Flex;以JS為基礎的Bindows;Ajax等等很多。
UI控制邏輯
UI控制邏輯負責處理UI和業務層之間的數據交互,UI之間狀態流程的控制,同時負責簡單的數據驗證和格式化等功能。具體的說在dotNet事件驅動的編程模型下,UI控制邏輯被自然的實現在了事件函數中,例如PageLoad事件函數,ButtonClick事件函數。在這些事件函數中,主要任務就是做UI控件與業務實體的數據交換與業務調用,但面對大量的數據交換工作量與維護量就成了最大的問題。而在復雜應用的系統中,狀態與流程的管理是必須要考慮的因素,它包含了界面與業務兩方面。如果不加以封裝的直接寫在事件函數中將導致業務依賴表示層。下面分別討論這兩個問題。
1.UI與業務實體之間的數據交互
此階段負責數據交換的業務實體我把它稱為DTO(Data Transfer Object),但需要說明的是這裡的DTO並不是只包含數據的業務對象,它仍然包含必要的方法是完整的業務實體。處理輸入時我們從UI控件的獲得數據填入DTO再向下傳播,處理輸出時用戶發出請求業務層會將數據以DTO的形式返出再賦給UI控件展現。因此需要一種方式來自動解決這樣的來回賦值問題。Java下Structs的Formbean對此問題提供了一定支持,而遺憾的是dotNet下的不少控件雖然支持數據綁定但仍然沒有一個現成完整的解決辦法。一種比較簡單的方式是自己設計一個Adapter按照某種映射關系來自動處理這樣的綁定,這樣的映射關系最好是UI控件與DTO屬性的事先命名約定,以此種方式的約定作為映射關系無需增加任何配置文件和配置工作即可實現。例如你的一個輸入人名的Textbox命名為txtUserName,而我的業務實體屬性命名為UserName,這樣就可以通過字符串的查找來找到對應。
2.狀態與流程的管理
復雜業務方面的狀態與流程可以通過一些工作流引擎來解決,微軟最近獨立發布了自己的工作流引擎有興趣的朋友可以去看看。一般更多的情況是需要解決界面上狀態與流程的管理。耦合再表示層中是不可取的辦法。MVC(Model-View-Controller)模式提供了實現這一目標的方法。Con......余下全文>>