在ASP.NET Core中,依赖注入是一项重要的功能,AddSingleton、AddScoped 和 AddTransient就是其中的一部分内容,这三个方法是向ASP.NET Core依赖注入容器注册服务的方法。在深入了解这几个方法之前,我们需要了解一下ASP.NET Core中依赖注入的基本概念。
## 1. 什么是依赖注入?
依赖注入是指在类中通过构造函数或属性的方式来获取依赖的对象实例。依赖注入使得类与类之间解耦,通过注入不同的对象实现类的不同行为。ASP.NET Core自带一个依赖注入容器,通过它可以方便地实现依赖注入。
## 2. AddSingleton
AddSingleton方法用于注册在容器中唯一的、全局共用的服务对象。什么意思呢?就是说,每次使用这个服务的时候,都会使用同一个对象实例。
2.1 AddSingleton 方法使用示例
首先,在Startup类的ConfigureServices方法中,使用AddSingleton方法注入服务:
services.AddSingleton<ISomeService, SomeService>();
这个方法的意思是:将ISomeService接口和SomeService实现类注册为全局唯一的服务对象,当需要使用ISomeService时,就会返回同一个SomeService对象实例。需要注意的是,这个SomeService对象是全局共用的,如果在其他地方也使用了这个服务,得到的也是同一个实例。
2.1.1 全局共用示例代码
// 注册服务
services.AddSingleton<ISomeService, SomeService>();
// 获取服务
var service1 = serviceProvider.GetService<ISomeService>();
var service2 = serviceProvider.GetService<ISomeService>();
// 对比两个实例是否相同
Console.WriteLine(service1 == service2); // 输出:True
从输出结果可以看出,获取到的两个服务实例是同一个对象。
## 3. AddScoped
AddScoped方法用于注册在每个请求中只生成一个对象实例的服务。它的作用范围是在每一个请求中,也就是说,在同一个请求中获取的服务实例都是同一个对象。
3.1 AddScoped 方法使用示例
先用AddScoped方法注入服务:
services.AddScoped<ISomeService, SomeService>();
这样,在每个HTTP请求中都会创建唯一的对象实例。比如在控制器中使用这个服务:
public class HomeController : Controller
{
private readonly ISomeService _someService;
public HomeController(ISomeService someService)
{
_someService = someService;
}
public IActionResult Index()
{
var result1 = _someService.DoSomething();
var result2 = _someService.DoSomething();
Console.WriteLine(result1 == result2); // 输出:True
return View();
}
}
上面的代码中,构造函数的参数是ISomeService类型,ASP.NET Core会自动从容器中获取这个服务。在Index方法中,多次调用_someService.DoSomething()方法,可以看到输出结果为True,说明这个服务实例是同一个。
## 4. AddTransient
AddTransient方法用于注册在每次请求时都创建新的服务对象实例。每次请求结束时,都会销毁这个服务对象实例。这是最常用的情况。
4.1 AddTransient 方法使用示例
使用AddTransient方法注册服务:
services.AddTransient<ISomeService, SomeService>();
这样,在每次请求时,都会创建新的对象实例。比如在控制器中使用这个服务:
public class HomeController : Controller
{
private readonly ISomeService _someService1;
private readonly ISomeService _someService2;
public HomeController(ISomeService someService1, ISomeService someService2)
{
_someService1 = someService1;
_someService2 = someService2;
}
public IActionResult Index()
{
var result1 = _someService1.DoSomething();
var result2 = _someService2.DoSomething();
Console.WriteLine(result1 == result2); // 输出:False
return View();
}
}
在构造函数中,注入了两个ISomeService类型的参数,这时候容器会创建两个不同的实例。在Index方法中,调用其DoSomething方法,可以看到输出结果为False,说明这两个服务实例是不同的。
## 5. 总结
AddSingleton、AddScoped 和 AddTransient三个方法是向ASP.NET Core依赖注入容器注册服务的方法。其中AddSingleton方法用于注册在容器中唯一的全局共用的服务对象。AddScoped方法用于注册在每个HTTP请求中只生成一个对象实例的服务。AddTransient方法用于注册在每次请求时都创建新的服务对象实例。在实际开发中,需要根据具体情况来选择使用哪种注册方法,以满足业务需求。