1.首先 准备 两个类 一个接口来测试一下
ITest
namespace WebApplication1_ioc.Server
{
public interface ITest
{
public int show(int i);
public int show2(int i);
}
}
namespace WebApplication1_ioc.Server
{
public class TestClass : ITest
{
public int show(int i)
{
return i;
}
public int show2(int i)
{
return i+1;
}
}
}
namespace WebApplication1_ioc.Server
{
public class TestClass2 : ITest
{
public int show(int i)
{
return i;
}
public int show2(int i)
{
return i+3;
}
}
}
以上是 TestClass 和 TestClass2 都继成 ITest接口 。
2.注册
现在我们以Core6 中 使用,首先 在Program 中注册 这两个类(Core5.0 可以在 在start.up类中ConfigureServices方法对实例进行注册)
builder.Services.AddTransient<ITest, TestClass>();
builder.Services.AddTransient<ITest, TestClass2>();
3.控制器中使用
现在说一下在控制器中的两种使用
1构造函数中使用
public class t1Controller : ControllerBase
{
private readonly ITest _TestClass;
public t1Controller( ITest TestClass)
{
_TestClass= TestClass;
}
[HttpGet(Name = "t1")]
public int Get()
{
int a = _TestClass.show(5);
return a;
}
}
2. IServiceProvider 使用方式
public class t2Controller : ControllerBase
{
private readonly ITest ts1;
private readonly IServiceProvider _serviceProvider1 = null;
public t2Controller(IServiceProvider serviceProvider)
{
_serviceProvider1 = serviceProvider;
}
[HttpGet(Name = "t2")]
public int Get()
{
var ts2 = (TestClass2)_serviceProvider1.GetService(typeof(ITest));
return ts2.show2(5);
}
}
4内置的IOC 有三种生命周期
Transient:瞬时生命周期, Transient服务在每次被请求时都会被创建一个新的对象。这种生命周期比较适用于轻量级的无状态服务。
Scoped: Scoped生命周期的服务是每次web请求被创建,局部单例对象, 在某个局部内是同一个对象(作用域单例,本质是容器单例);一次请求内是一个单例对象,多次请求则多个不同的单例对象.
Singleton: Singleton生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是自己来走这些事情。
//注入生命周期为单例的服务
builder.Services.AddSingleton<ITest, TestClass>();
//注入生命周期为Scoped 的服务
builder.Services.AddScoped<ITest, TestClass>();
//注入生命周期为瞬时的服务
builder.Services.AddTransient<ITest, TestClass2>();