在java的spring中有自動注入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程
1.使用自動注入場景分析
在asp.net mvc中,無論是什么代碼邏輯分層,最終的表現層為Controller層,所以我們注入點就是在Controller中,這里我們需要替換默認的ControllerFactory,掃描代碼中標記需要注入的對象,進行實例化注入
FastControllerFactory就是我們自定義的一個Controller工廠,重寫CreateController方法,對標記了AutoWired這個自定義注解的變量,從Bean容器中取出實例進行賦值,同時我們還需要在Global文件中的Start方法中,進行默認工廠進行替換
2.IOC容器的實現
c#中的自定義容器有很多開源成熟的框架,例如AutoFac等,這里我們是自己實現一個輕量級的版本
源碼地址:https://gitee.com/grassprogramming/FastIOC
這里就重點說一下如何在asp.net mvc中的使用,首先我們需要對需要注入的Bean對象進行標記,這個標記就叫做Component,
在asp.net mvc Global文件中的Start方法中,我們需要將整個項目中需要自動注入的Bean加入到容器中
到這里Controller層面的事項就已經完成了,接下來就需要在IOC容器中初始化Bean實例方法中進一步處理
GetInstance方法就是實例化Bean對象的核心方法,其實很簡單,就是通過反射創建對象,其中需要注意的有兩點
1)對於一個Bean初始化時需要掃描Bean中的所有變量,如果內部還有依賴注入的嵌套對象,需要使用遞歸,直到沒有需要注入的Field
2)我這里使用的是單例模式,因為在測試過程中可能存在在A類中對B進行依賴注入,在B類中對A進行依賴注入,常規創建過程,如果使用遞歸進行掃描,就會進入死循環,內存溢出,所以使用對象的單例,一旦創建就放入字典中,如果再次掃描到該對象需要注入,則直接取出使用,就避免了循環引用
3.其他
對其他不在Controller中使用的類需要依賴注入,則需要直接從IOC的Bean容器取出使用