依赖注入容器(IOC)
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
通俗来讲,就是把有依赖关系的类放到容器中,然后在我们需要这些类时,容器自动解析出这些类的实例。
依赖注入最大的好处时实现类的解耦,利于程序拓展、单元测试、自动化模拟测试等。依赖注入的英文为:Dependency Injection
,简称 DI
。(说明来自网络)
TouchSocket
内置了Container
容器。
二、特点
- 支持构造函数、属性、方法三种注入方式,可以选择其中部分生效。
- 支持
Singleton
、Transient
两种生命周期。 - 支持单接口,多实现注入。
- 支持当获取类型是可实例类型时,即使不注册,也能成功构造。
- 支持默认参数注入。
- 支持构建参数注入。
- 支持标签参数注入。
- 支持泛型注入。
- 支持Object注入。
- 支持源生成注入,全面接入AOT模式。
三、注入方式
3.1 构造函数注入
【定义类型】
class MyClass1
{
}
class MyClass2
{
public MyClass2(MyClass1 myClass1)
{
this.MyClass1 = myClass1;
}
public MyClass1 MyClass1 { get; }
}
【注册和获取】
var container = new Container();
container.RegisterSingleton<MyClass1>();
container.RegisterSingleton<MyClass2>();
var myClass1 = container.Resolve<MyClass1>();
var myClass2 = container.Resolve<MyClass2>();
3.2 属性注入
使用DependencyInject
标记属性,即可注入。
【定 义类型】
class MyClass3
{
/// <summary>
/// 直接按类型,默认方式获取
/// </summary>
[DependencyInject]
public MyClass1 MyClass1 { get; set; }
/// <summary>
/// 获得指定类型的对象,然后赋值到object
/// </summary>
[DependencyInject(typeof(MyClass2))]
public object MyClass2 { get; set; }
/// <summary>
/// 按照类型+Key获取
/// </summary>
[DependencyInject("key")]
public MyClass1 KeyMyClass1 { get; set; }
}
【注册和获取】
var container = new Container();
container.RegisterSingleton<MyClass1>();
container.RegisterSingleton<MyClass1>("key");
container.RegisterSingleton<MyClass2>();
container.RegisterSingleton<MyClass3>();
var myClass3 = container.Resolve<MyClass3>();
提示
DependencyInject
特性中,Type
和Key
,可以同时使用,也可以只使用其中一个。
3.3 方法注入
使用DependencyInject
标记属性,即可对方法注入。
【定义类型】
class MyClass4
{
public MyClass1 MyClass1 { get;private set; }
[DependencyInject]
public void MethodInject(MyClass1 myClass1)
{
this.MyClass1 = myClass1;
}
}
【注册和获取】
var container = new Container();
container.RegisterSingleton<MyClass1>();
container.RegisterSingleton<MyClass4>();
var myClass4 = container.Resolve<MyClass4>();
提示
DependencyInject
特性,也可以在方法注入时,对参数进行使用。