本开源项目是为了满足fastapi.net开源框架的动态插件机制需要,结合.NetCore的反射机制和dynamic动态对象类型的特点,实现而成的一套IoC容器工具类库;本着简单易用、轻量级、最小满足、无第三方依赖等基本原则,Wukong具备如下功能特色:
.NetCore3.1:3.0.0之前的版本全部基于netcore3.1开发;后续所有变更在netcore3.1分支进行。
.Net8.0:从3.0.0开始,项目全部基于net8.0开发;后续所有变更在master分支进行。
Install-Package Wukong -Version 3.0.0
dotnet add package Wukong --version 3.0.0
<PackageReference Include="Wukong" Version="3.0.0" />
paket add Wukong --version 3.0.0
Wukong为了方便调用,将所有功能统一封装集成到静态类Wukong中;在使用时,通过调用Wukong类下的对应静态方法即可,简单方便。
- 对象所在的程序集被当前项目正常引用。
- 对象所在的程序集必须在Wukong搜索路径范围内(可通过
AddSearchPath
方法添加搜索路径)。
-
通过指定类全名称和构造参数生成对象实例(无需配置文件)
-
通过指定配置文件中定义的对象Id生成对象实例(需在配置文件中定义,并通过
LoadConfig
方法加载)。
Wukong对加载的配置文件和单实例对象的缓存以调用程序集为特征进行隔离,不同程序集之间不进行共享。
public static void AddSearchPath(string path)
path: 搜索路径,绝对路径。
无
public static void RemoveSearchPath(string path)
path:搜索路径
无
public static void LoadConfig(string configFile, bool append = true)
configFile: 配置文件,绝对路径。
append: 是否使用添加模式,默认为true。
无
public static void LoadConfig(string configFile, string objectPath, bool append = true)
configFile: 配置文件,绝对路径。
objectPath: 自定义对象的XML路径。
append: 是否使用添加模式,默认为true。
无
<!--例:c:\\obj.xml对象配置文件采用如下格式-->
<processors>
<processor id="test" class="TestExample.Person"></processor>
</processors>
// 使用如下方法加载c:\\obj.xml对象配置文件
Wukong.LoadConfig("c:\\obj.xml", "/processors/processor")
public static bool ExistsClass(string classFullName)
classFullName: 类全名称。
存在返回True;否则,返回False。
public static bool ExistsConfig(string configId)
configId: 配置对象Id。
存在返回True;否则,返回False。
public static object GetObject(string classFullName, params object[] args)
classFullName: 类全名称。
args: 对象构造参数数组。
生成的对象实例。
public static T GetObject<T>(string classFullName, params object[] args)
classFullName: 类全名称。
args: 对象构造参数数组。
指定类型的对象实例。
public static object GetSingleObject(string classFullName, params object[] args)
classFullName: 类全名称。
args: 对象构造参数数组。
生成的对象实例,相同构造参数多次调用返回同一实例。
public static T GetSingleObject<T>(string classFullName, params object[] args)
classFullName: 类全名称。
args: 对象构造参数数组。
指定类型的对象实例,相同构造参数多次调用返回同一实例。
public static object GetObjectById(string objectId)
objectId: 配置文件中对象Id
生成的对象实例。
public static T GetObjectById<T>(string objectId)
objectId: 配置文件中对象Id
指定类型的对象实例。
public static object GetSingleObjectById(string objectId)
objectId: 配置文件中对象Id
对象实例,多次调用返回同一实例。
public static T GetSingleObjectById<T>(string objectId)
objectId: 配置文件中对象Id
指定类型的对象实例,多次调用返回同一实例。
public static object Invoke(object inst, string method, params object[] args)
inst: 要执行的方法所在的对象实例,必填。
method: 要执行方法的名称,忽略大小写,必填。
args: 要执行方法所需要的参数,可选。
执行方法后得到的返回值。
public static T Invoke(object inst, string method, params object[] args)
T: 泛型参数,指定期望得到的返回值类型,必填。
inst: 要执行的方法所在的对象实例,必填。
method: 要执行方法的名称,忽略大小写,必填。
args: 要执行方法所需要的参数,可选。
执行方法后得到的返回值。
public static void ClearCache()
无。
无。
通过配置文件可以预先把项目会用到的对象在XML文件中进行定义和初始化,配合项目框架使用,可以提供更大的灵活性和易用性。
配置文件默认以objects
为根节点,每个对象都使用object
标签定义。
objects
object
Id:对象Id,在配置文件内必须唯一;必填。
class:对象类全名称;必填。
<objects>
<object id="person" class="TestExample.Person"></object>
</objects>
通过定义指定类型的参数,生成对象实例时,会自动调用对应的构造参数生成实例。
object
constructor-arg
type:参数类型;支持String、Byte、Int16、Int32、Double等基本类型,以及枚举类型(使用类型全名称)。
ref:引用对象的Id值,当参数为对象类型时需要此值。
参数值,当未指定type属性值,且值为String时,请使用双引号或单引号进行注明。
通过定义属性,可以在生成实例后对实例进行期望的初始化操作。
object
property
name:要初始化的属性名称,可忽略大小写。
ref:引用对象的Id值,当属性类型为对象类型时需要此值。
参数值,当未指定type属性值,且值为String时,请使用双引号或单引号进行注明。
当构造参数或属性类型为列表时,需要使用该标签。
constructor-arg、property
list
type:列表项目类型;支持String、Int16、Int32、Double等基本类型,以及枚举类型(使用类型全名称)。
当构造参数或属性类型为列表时,需要使用该标签。
constructor-arg、property
array
type:列表项目类型;支持String、Int16、Int32、Double等基本类型,以及枚举类型(使用类型全名称)。
当定义列表项或数组项内容时,需要使用该标签。
list、array
value
ref:引用对象的Id值,当列表项或数组项类型为对象类型时需要此值。
列表项/数组项的值。
<!--
配置文件 c:\ioc.xml
-->
<objects>
<object id="defaultPerson" class="TestExample.Person">
</object>
<object id="initNameAndAgeAndIsChinese" class="TestExample.Person">
<constructor-arg>"张三"</constructor-arg>
<constructor-arg type="Int32">18</constructor-arg>
<constructor-arg type="TestExample.Sex">Male</constructor-arg>
</object>
<object id="fater" 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>
<object id="usedNames" class="TestExample.Person">
<constructor-arg>"张三"</constructor-arg>
<constructor-arg>
<array type="string">
<value>张飞</value>
<value>张良</value>
</array>
</constructor-arg>
</object>
<object id="initHobbies" class="TestExample.Person">
<constructor-arg>"张三"</constructor-arg>
<constructor-arg>
<list type="string">
<value>"打篮球"</value>
<value>看电影</value>
<value>游泳</value>
</list>
</constructor-arg>
</object>
</objects>
// 加载配置文件
Wukong.LoadConfig("c:\\ioc.xml");
// 通过无参构造函数生成实例
dynamic person = Wukong.GetObject("TestExample.Person");
// 通过特定参数的构造函数生成实例
dynamic person2 = Wukong.GetObject("TestExample.Person", "张三");
// 获取配置文件中Id为person的对象实例
dynamic person = Wukong.GetObjectById("defaultPerson");
// 获取配置文件中Id为person2的对象实例
dynamic person2 = Wukong.GetObjectById("initNameAndAgeAndIsChinese");
Person pernson = new Person("张三");
object name = Wukong.Invoke(pernson, "GetName");
string name2 = Wukong.Invoke<string>(pernson, "GetName");