3 Singleton - 只创建一次
通过AddScoped方法注册的服务不像AddTransient 方法那样每次都被创建,实际上它复用了来自同一客户端的请求,这意味着,如果我们使用这个方法来代替AddTransient,那么Repository.cs类对象将只创建一个,并在浏览器的同一个请求后续中共享该实例,然而,如果我们从另一台电脑的浏览器请求该应用程序,那么(对于这个新客户端)将为每个后续请求创建并共享一个新服务
builder.Services.AddTransient<IRepository, Repository>(); builder.Services.AddTransient<ProductSum>();ProductSum类在指定的构造函数指定了IRepository依赖
namespace AspNetCore.DependencyInjection.Models { public class ProductSum { public IRepository Repository { get; set; } public ProductSum(IRepository repo) { Repository = repo; } public decimal Total => Repository.Products.Sum(p => p.Price); } }HomeController指定针对这两个服务的依赖
public HomeController(IRepository repository, ProductSum productSum) { _repository = repository; _productSum = productSum; }在Repository.cs类中重写ToString()方法,代码如下:
private string guid= Guid.NewGuid().ToString(); public override string ToString() { return guid; }我们可以通过这个值来判断依赖注入什么时候以及如何创建这个Repository,接下来进入HomeController并且在Index的方法中添加2个ViewBag变量,第一 ViewBag变量将包含从Repository接受的GUID,第二个ViewBag变量包含从ProductSum服务接受的GUID
public IActionResult Index() { ViewBag.HomeControllerGUID=_repository.ToString(); ViewBag.TotalGUID = _productSum.ToString(); return View(new Repository().Products); }现在运行应用程序我们将会在页面上看到显示的GUID
builder.Services.AddScoped<IRepository, Repository>();重新运行应用程序并且你将看到相同的GUIDS, 这意味着ServiceProvider创建了一个Repository对象类并且和ProductSum共享该实例,这是Scoped和Transient服务之间的不同。重新加载页面按下F5,你将看到新的GUID被生成(因为浏览器初始化了一个新的HTTP请求)
builder.Services.AddSingleton<IRepository,Repository>();重新运行你的应用程序,你将看到这两个GUID值是相同的,刷新页面你注意GUID值并没有改变