【Github源码】

本文重点要说的是如何通过引入Wukong第三方包让自己的系统能够拥有IOC容器能力,但在具体讲解步骤之前,还是想先简单的介绍一下什么是IOC以及它存在的意义;同时也就能清楚Wukong能为大家解决哪些问题。

一、IOC的用途和意义?

​ IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”;也有的地方叫做“依赖注入(Dependency Injection)”。

​ 作者的理解IOC是一种基于工厂模式的更高级的对象获取模式;使用该方法,可以将通过new方法创建对象实例的传统方式;替换为通过IOC容器获取对象实例。通过使用IOC容器消除了对象之间的依赖强耦合,实现了对象之间的解耦,使得系统更灵活、更易扩展和维护。

1. 传统的对象获取方式

传统方式必须在项目中显示引入对象所在程序集,同时在需要对象的位置进行显示创建。

Person p = new Person();
p.SetName("张三");
2. IOC容器获取对象方式

​ 而IOC方式,项目只需要显示引入Wukong依赖包,其他需要的对象通过IOC容器进行获取;IOC和各个对象之间完全是弱引用,只会在IOC获取真实对象实例时,才会去相应位置搜索对象定义并创建实例。

dynamic p = Wukong.GetObject("CodeM.Test.Person");
p.SetName("张三");

二、如何引入Wukong依赖

1. Package Manager
Install-Package Wukong -Version 2.0.5
2. .NET CLI
dotnet add package Wukong --version 2.0.5
3. PackageReference
<PackageReference Include="Wukong" Version="2.0.5" />
4. Paket CLI
paket add Wukong --version 2.0.5

三、如何通过Wukong获取对象实例

Wukong提供了两种获取对象的方式,一种是通过类全名称,二是通过配置方式获取。

1. 通过类全名称获取对象实例

​ Wukong提供了GetObjectGetObjectGetSingleObjectGetSingleObject四个方法,用于支持泛型、单例。

2. 通过配置方式获取对象实例

​ 通过配置方式更加灵活,系统扩展和维护无需重新编译;同时能够在配置时,为对象属性进行赋值和初始化操作;并且支持配置对象间的依赖引用。

dynamic person = Wukong.GetObjectById("person");

​ 同样,Wukong也为通过配置方式获取对象实例提供了GetObjectByIdGetObjectByIdGetSingleObjectByIdGetSingleObjectById四个不同的方法,使用时可根据不同场景自由选择。

四、对象配置文件定义

​ 对象配置文件采用XML格式,支持对象构造方法定义、属性赋值定义;构造参数和属性值类型支持字符串、数值、布尔、日期时间等常用简单类型,以及枚举 、列表、数组、对象引用等复杂类型。

<?xml version="1.0" encoding="utf-8" ?>
<objects>
<object id="father" class="TestExample.Person">
<constructor-arg>"张三"</constructor-arg>
<constructor-arg type="TestExample.Sex">Male</constructor-arg>
</object> <object id="mother" class="TestExample.Person">
<constructor-arg>"李四"</constructor-arg>
<constructor-arg type="TestExample.Sex">Female</constructor-arg>
</object> <object id="intParents" class="TestExample.Person">
<constructor-arg ref="father"></constructor-arg>
<constructor-arg ref="mother"></constructor-arg>
</object>
</objects>

更多详细对象配置文件的规则请查看完整Github说明文档

五、通过Wukong获取对象是如何找到对象所在程序集的

​ 前面讲到传统方式使得对象之间依赖性太强,耦合严重;造成这个问题的原因有两个:一是在每个使用对象的位置都需要通过new方法创建实例;二是所有使用到的对象都必须在项目中引用对象所在的包。

​ 那么当我们指定了类的全名称之后,Wukong是如何通过类全名称找到相应的类定义信息并创建实例的呢?Wukong有两种方法实现上述目的:一是像传统方法一样将对象所在的第三方包进行显示引用,但这种方式会导致引用之间的强耦合性;同时对于系统的扩展性不是很友好;因此并不推荐;第二种方式是将第三方包程序集文件放到系统运行目录或其他指定目录即可,该种方式灵活已扩展,且方便系统运行中的热更新,推荐使用该方法。

​ 当使用第二种方法时,如果将第三方包程序集文件放在系统运行目录中,不需要做额外工作,即可通过Wukong正常获取到其中的对象实例;假如因为某种原因需要将程序集文件放到其他指定目录中,此时需要使用Wukong提供的方法AddSearchPath将目录添加到搜索范围内,Wukong才能够正常获取到对象实例。

// 指定Wukong创建对象实例时,在如下路径中搜索对象定义
Wukokng.AddSearchPath("c:\\libs");

六、常用方法说明

1. 添加程序集搜索路径(默认只在应用执行目录中搜索)
定义:

public static void AddSearchPath(string path)

参数:

path: 搜索路径,绝对路径。

返回:

2. 根据类全名称获取对象实例
定义:

public static object GetObject(string classFullName, params object[] args)

参数:

classFullName: 类全名称。



args: 对象构造参数数组。

返回:

生成的对象实例。

3. 根据类全名称获取指定类型的对象实例
定义:

public static T GetObject<T>(string classFullName, params object[] args)

参数:

classFullName: 类全名称。



args: 对象构造参数数组。

返回:

指定类型的对象实例。

4. 以单例模式根据类全名称获取对象实例
定义:

public static object GetSingleObject(string classFullName, params object[] args)

参数:

classFullName: 类全名称。



args: 对象构造参数数组。

返回:

生成的对象实例,相同构造参数多次调用返回同一实例。

5. 以单例模式根据类全名称获取指定类型的对象实例
定义:

public static T GetSingleObject<T>(string classFullName, params object[] args)

参数:

classFullName: 类全名称。



args: 对象构造参数数组。

返回:

指定类型的对象实例,相同构造参数多次调用返回同一实例。

6. 根据配置文件Id获取对象实例
定义:

public static object GetObjectById(string objectId)

参数:

objectId: 配置文件中对象Id

返回:

生成的对象实例。

7. 根据配置文件Id获取指定类型对象实例
定义:

public static T GetObjectById<T>(string objectId)

参数:

objectId: 配置文件中对象Id

返回:

指定类型的对象实例。

8. 以单例模式根据配置文件Id获取对象实例
定义:

public static object GetSingleObjectById(string objectId)

参数:

objectId: 配置文件中对象Id

返回:

对象实例,多次调用返回同一实例。

9. 以单例模式根据配置文件Id获取指定类型的对象实例
定义:

public static T GetSingleObjectById<T>(string objectId)

参数:

objectId: 配置文件中对象Id

返回:

指定类型的对象实例,多次调用返回同一实例。

【Github源码】

引入Wukong让你的系统瞬间具备IOC能力的更多相关文章

  1. webpack构建具备版本管理能力的项目

    webpack是时下十分流行的编译和打包工具,它提供一种可扩展的loader的方式,简单的配置,便可以编译打包各类型的文件,包括js.css.image.font.html,以及各种预编译语言都不在话 ...

  2. 一个中高级PHP工程师所应该具备的能力

    很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望给初级或已经达到中级的PHP工程师一些帮助. 一.平静 ...

  3. AIOps背景/所应具备技术能力分析(上)

    本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...

  4. 【转】测试开发工程师必备软硬能力&高级测试开发工程师需要具备什么能力?

    对于测试的基本知识,可以查看软件测试相关书籍 对于在公司成为一位优秀的测试开发工程师,我觉得下面这篇文章涉及到的是我们需要的,稍微进行改动https://blog.csdn.net/sinat_210 ...

  5. vue项目引入FastClick组件解决IOS系统下h5页面中的按钮点击延迟,连续点击无反应的问题

    异常描述: ios系统手机中访问h5页面,按钮点击有延迟,连续点击卡顿.无反应. 异常原因: 这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设 ...

  6. 一个GIS系统需具备的功能

    数据的存储(数据结构) 图形显示 功能:拓扑分析 开源的GIS系统:QGIS,SharpMap 各个功能组件

  7. IT项目经理都需要具备哪些能力

    发布时间:05-2009:24优质原创作者 项目经理是IT行业中比较常见的职位,工作职责主要包括三个方面,其一是资源整合任务:其二是沟通协调任务:其三是保障项目的时间周期. 资源整合能力是项目经理的重 ...

  8. 转:亿级Web系统的高容错性实践(好博文)

    亿级Web系统的高容错性实践 亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没 ...

  9. 亿级Web系统的高容错性实践

    亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没日没夜处理告警,周末和凌晨也经 ...

随机推荐

  1. identity server4 授权成功页面跳转时遇到错误:Exception: Correlation failed. Unknown location的解决方法

    一.异常信息描述 错误信息,看到这个页面是否耳熟能详担又不知道怎么解决 ,坑死个人不偿命,,,,,,,, 二.处理方法 1.在web项目中增加类SameSiteCookiesServiceCollec ...

  2. java------常见的进制、不同进制在代码中的表现形式、进制之间的转化、分辨率、三原色、计算机的存储规则

    常见的进制: 常见的进制:二进制.八进制.十进制.十六进制 不同进制在代码中的表现形式: 进制之间的转化: 二进制转十进制: 普通方法: 快捷方法: 八进制转十进制: 十六进制转十进制: 总结: 分辨 ...

  3. 分布式二级缓存组件实战(Redis+Caffeine实现)

    前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...

  4. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  5. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...

  6. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  7. [跨数据库、微服务] FreeSql 分布式事务 TCC/Saga 编排重要性

    前言 FreeSql 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/Gbase/神通/人大金仓/翰高/Clickhouse/MsAcc ...

  8. spring使用junit单元测试

    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test& ...

  9. html弹出二选一窗口,然后根据点击执行对应的js方法

    html弹出二选一窗口,然后根据点击执行对应的js方法 layer.confirm("我是弹出来的字", {btn:['确认','取消']}, function(){ ...方法1 ...

  10. dentry的引用计数不对导致的crash

    [17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...