Json.NET提供依赖注

[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)

前言

在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成、生命周期管理...等等延伸功能,只需要,单纯使用反射生成功能,从配置文件取得功能对象来注入到系统。在这样的开发情景中,如果选择Spring .NET、Unity来做为系统的依赖注入模块,无形中就增加了系统的技术门坎、增加了开发人员的知识负担。

本篇文章介绍如何使用Json.NET来反射生成JSON配置文件中所定义的功能对象,让开发人员能够透过设定简单的JSON档案、简洁易懂的指令,来提供系统使用依赖注入的功能。主要为自己留个纪录,也希望能帮助到有需要的开发人员。

开发

加入Json.NET

使用Visual Studio开启项目之后,开发人员可以透过内建的NuGet封装管理员来安装Json.NET套件。

建立依赖注入的接口与实作

建立项目并且加入Json.NET套件之后,就可以先着手在项目内,建立系统所需要依赖注入的接口与实作。

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」之外的属性,则是会被剖析为对象的建构参数、对象属性。

[
{
"$type": "JsonDISample.Dog, JsonDISample"
}, {
"$type": "JsonDISample.Cat, JsonDISample",
"cry": "Meow"
}, {
"$type": "JsonDISample.Cat, JsonDISample",
"cry": "Purr"
}
]

使用Json.NET注入物件

最后使用下列程序代码,从档案中读取JSON配置文件内容,再使用JsonConvert.DeserializeObject反射生成对象,就可以将Json.NET生成的接口与实作,注入系统来使用。另外,在这段程序代码中,要特别注意「JsonSerializerSettings.TypeNameHandling」这个属性必须要设定为All,这样Json.NET才会特别去处理$type属性来反射生成指定对象。

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配置文件的内容,动态生成对象、并且提供这些对象给系统使用。

范例下载

范例程序:点此下载

Json.NET提供依赖注的更多相关文章

  1. [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)

    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...

  2. 分解uber依赖注入库dig-使用篇

    golang的依赖注入库非常的少,好用的更是少之又少,比较好用的目前有两个 谷歌出的wire,这个是用抽象语法树在编译时实现的. uber出的dig,在运行时,用返射实现的,并基于dig库,写了一个依 ...

  3. 分解uber依赖注入库dig-源码分析

    上一篇帖子 分解uber依赖注入库dig-使用篇 把如何使用dig进行代码示例说明,这篇帖子分析dig的源码,看他是如何实现依赖注入的. dig实现的中心思想:所有传入Provide的函数必须要有除e ...

  4. Package.json中dependencies依赖包中^符号和~符号前缀的区别

    刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...

  5. spring依赖注入时,什么时候会创建代理类

    spring 依赖注入时,什么时候会创建代理类 有的会创建代理类来替代目标类的实现.比如有事务注解啊 有的直接使用目标类.啥拦截配置都没有.

  6. leetcode中Java关于Json处理的依赖

    leetcode的java代码提供的main函数中,往往有关于json的依赖...我找了许久才找到他们用的是这个json实现 <dependency> <groupId>com ...

  7. JSON数据源提供多值参数的实现

    一.应用场景 (1)报表的数据内容需要根据某个参数进行过滤. (2)该参数是一个多值参数,即从一个下拉列表中选择一个或多个项目. (3)报表需要自动运行,因此参数必须有默认值. (4)参数默认值无法在 ...

  8. Google 开源的依赖注入库,比 Spring 更小更快!

    Google开源的一个依赖注入类库Guice,相比于Spring IoC来说更小更快.Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式. 学习目标 概述: ...

  9. package.json中 npm依赖包版本前的符号的意义

    版本的格式 major.minor.patch 主版本号.次版本号.修补版本号 ———————————————————— patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 majo ...

随机推荐

  1. WITH AS

    表 id  pid  name获取 下面所有的子节点

  2. 间隔DP基础 POJ2955——Brackets

    取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i, ...

  3. adodb.RecordSet的属性和方法

    为了更精确地跟踪数据,要用RecordSet组件创建包括数据的游标,游标就是储存在内存中的数据: rs = Server.CreateObject("ADODB.RecordSet" ...

  4. ios01

    http://code4app.com/ 0.全部Swift http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/ ...

  5. 第三届蓝桥杯Java高职组决赛第三题

    题目描述: 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). 例如,我们可以对小车输入如 ...

  6. 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩

    原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...

  7. Xamarin.Android 在VS下调试时提示 In mgmain JNI_OnLoad 程序“Mono”已退出 解决办法

    原因是使用了破解版的 Xamarin,调试时不能使用共享库

  8. U菜1G变化8M该解决方案

    我有一个大小1G纽曼U菜,不幸中毒一年前,格式化后你刚刚离开8M该.然后不再格式正确. 尽管只有8M,但始终我觉得扔了可惜.曾经,它已被搁置.昨天突然心血来潮,我们决定尝试.活马医.想不到最后居然被我 ...

  9. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

    桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...

  10. 【转】Directx11 SDK文档

    原文地址:http://blog.csdn.net/cmt100/article/details/6343274 总结 这是一个初步的教程.我们将通过必要的步骤来创建一个Win32 Applicati ...