在一些小型項目的開發情景裏,系統不須要大型DI Framework所提供的:單一對象生成、生命週期管理...等等延伸功能,只須要,單純使用反射生成功能,從配置文件取得功能對象來注入到系統。在這樣的開發情景中,若是選擇Spring .NET、Unity來作爲系統的依賴注入模塊,無形中就增長了系統的技術門坎、增長了開發人員的知識負擔。git
本篇文章介紹如何使用Json.NET來反射生成JSON配置文件中所定義的功能對象,讓開發人員可以透過設定簡單的JSON檔案、簡潔易懂的指令,來提供系統使用依賴注入的功能。主要爲本身留個紀錄,也但願能幫助到有須要的開發人員。github
使用Visual Studio開啓項目以後,開發人員能夠透過內建的NuGet封裝管理員來安裝Json.NET套件。json
創建項目而且加入Json.NET套件以後,就能夠先着手在項目內,創建系統所須要依賴注入的接口與實做。post
public interface IAnimal { // Methods void Hit(); } public class Dog : IAnimal { // Methods public void Hit() { Console.WriteLine("Dog : " + "Running"); } } public class Cat : IAnimal { // Fields private readonly string _cry = null; // Constructors public Cat(string cry) { // Default _cry = cry; } // Methods public void Hit() { Console.WriteLine("Cat : "+ _cry); } }
接着使用Json.NET所定義的格式,來創建對象反射生成所須要的JSON配置文件。在這份配置文件中,每一個對象的「$type」屬性使用逗號來切割內容。逗號前的內容,表明了這個對象的命名空間+類別名稱;逗號後的內容表明瞭這個對象的組件名稱。而其餘「$type」以外的屬性,則是會被剖析爲對象的建構參數、對象屬性。3d
[ { "$type": "JsonDISample.Dog, JsonDISample" }, { "$type": "JsonDISample.Cat, JsonDISample", "cry": "Meow" }, { "$type": "JsonDISample.Cat, JsonDISample", "cry": "Purr" } ]
最後使用下列程序代碼,從檔案中讀取JSON配置文件內容,再使用JsonConvert.DeserializeObject反射生成對象,就能夠將Json.NET生成的接口與實做,注入系統來使用。另外,在這段程序代碼中,要特別注意「JsonSerializerSettings.TypeNameHandling」這個屬性必需要設定爲All,這樣Json.NET纔會特別去處理$type屬性來反射生成指定對象。code
static void Main(string[] args) { // ConfigJson string configJson = System.IO.File.ReadAllText("animals.json"); if (configJson == null) throw new InvalidOperationException(); // SerializerSettings var serializerSettings = new JsonSerializerSettings(); serializerSettings.TypeNameHandling = TypeNameHandling.All; // Animal var animalList = JsonConvert.DeserializeObject<List<IAnimal>>(configJson, serializerSettings); if (animalList == null) throw new InvalidOperationException(); // Hit foreach (var animal in animalList) { animal.Hit(); } // End Console.ReadLine(); }
完成開發步驟後,就能夠按下Visual Studio的執行按鈕來檢視成果。接着觀察程序執行的結果,能夠發現系統的確依照JSON配置文件的內容,動態生成對象、而且提供這些對象給系統使用。對象
範例程序:點此下載blog