[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
前言
在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成、生命周期管理...等等延伸功能,只需要,单纯使用反射生成功能,从配置文件取得功能对象来注入到系统。在这样的开发情景中,如果选择Spring .NET、Unity来做为系统的依赖注入模块,无形中就增加了系统的技术门坎、增加了开发人员的知识负担。
本篇文章介绍如何使用Json.NET来反射生成JSON配置文件中所定义的功能对象,让开发人员能够透过设定简单的JSON档案、简洁易懂的指令,来提供系统使用依赖注入的功能。主要为自己留个纪录,也希望能帮助到有需要的开发人员。
/%E5%89%8D%E8%A8%8001.png)
开发
加入Json.NET
使用Visual Studio开启项目之后,开发人员可以透过内建的NuGet封装管理员来安装Json.NET套件。
/%E9%96%8B%E7%99%BC01.png)
建立依赖注入的接口与实作
建立项目并且加入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配置文件的内容,动态生成对象、并且提供这些对象给系统使用。
/%E5%9F%B7%E8%A1%8C01.png)
范例下载
范例程序:点此下载
[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)的更多相关文章
- 深度理解依赖注入(Dependence Injection)
前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...
- [转]深度理解依赖注入(Dependence Injection)
http://www.cnblogs.com/xingyukun/archive/2007/10/20/931331.html 前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相 ...
- Json.NET提供依赖注
Json.NET提供依赖注 [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提 ...
- ASPNET5 依赖注入(Dependency Injection)
依赖注入一直是asp.net web框架(Web API,SignalR and MVC)中不可或缺的一部分,但是在以前,这个框架都是各自升级,都有各自的依赖注入实现方式,即使Katana项目想通过O ...
- Spring-Context的注解实现依赖注入功能
使用Spring-Context的注解实现依赖注入功能. Demo要点: 本例子中主要使用Annotation功能来实现对MoviceService的注入.我们将Cinema.java的头部标注为@C ...
- SpringBoot中实现依赖注入功能
本文转载自:https://blog.csdn.net/linzhiqiang0316/article/details/52639888 今天给大家介绍一下SpringBoot中是如何实现依赖注入的功 ...
- Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能
前言 在使用PRISM+WPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能.无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关 ...
- Srping - bean的依赖注入(Dependency injection)
目录 1 概述 2 两种基本的依赖注入方式 2.1 构造函数方式 2.2Setter方式 3 其他依赖注入功能 3.1 <ref/>标签引用不同范围的bean 3.2 内部bean 3.3 ...
- PHP程序员如何理解依赖注入容器(dependency injection container)
背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim ...
随机推荐
- nodejs字符与字节之间的转换
new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg== */ ...
- android用讯飞实现TTS语音合成 实现中文版
Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...
- C++笔记(3):一些C++的基础知识点
前言: 找工作需要,最近看了下一些C++的基本概念,为范磊的<零起点学通C++>,以下是一些笔记. 内容: delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用 ...
- 轻松自动化---selenium-webdriver(python) (八)
本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同步执行javaScript 脚本:JavaScript的执行. *参数:适用任何JavaScr ...
- Testing - 测试基础 - 阶段
估算 测试对软件工作量的估算的准确性 测试评估软件系统的状况的准确性 关注点: 不准确的估算 不适当的开发过程 不真实的状态报告 如何知道对工作量的估算是正确的 估算工作量的工具很容易出错 对软件工作 ...
- Cardinal:一个用于移动项目开发的轻量 CSS 框架
Cardinal 是一个适用于移动项目的 CSS 框架,包含很多有用的默认样式.矢量字体.可重用的模块以及一个简单的响应式模块系统.Cardinal 提供了一种在多种移动设备上实现可伸缩的字体和布局的 ...
- 在Spring Boot中使用Https
本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https. Https证书 巧妇难为无米之炊,开始的开始,要先取得Https证书.你可以向证书机构申请证书 ...
- Spring定时器,定时执行(quartz)
这个定时器与继承了timertask的定时器不同的是,这个定时器是更强大的,可以指定每分的第n秒,每天的第n时,每周的.每年的.来定时运行这个定时器.那么下面来讲诉如何使用quartz定时器. spr ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 【Swift学习】Swift编程之旅(一)
学习一门新语言最经典的例子就是输出“Hello World!” print("Hello World!") swift就是这样来输出的. 如果你使用过其他语言,那么看上去是非常的熟 ...