在一些小型项目的开发情景里,系统不须要大型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