zoukankan      html  css  js  c++  java
  • AddTransient,AddScope和AddSingleton 有什么不同?

    我们先来创建几个接口
    using System;

    namespace DependencyInjectionSample.Interfaces
    {
    public interface IOperation
    {
    Guid OperationId { get; }
    }

    public interface IOperationTransient : IOperation
    {
    }
    public interface IOperationScoped : IOperation
    {
    }
    public interface IOperationSingleton : IOperation
    {
    }
    public interface IOperationSingletonInstance : IOperation
    {
    }
    }
    然后在服务中依赖注入上面的接口


    services.AddTransient<IOperationTransient, Operation>();
    services.AddScoped<IOperationScoped, Operation>();
    services.AddSingleton<IOperationSingleton, Operation>();
    services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
    services.AddTransient<OperationService, OperationService>();
    注意IOperationSingletionInstance和其他的依赖注入不同,它进行了显示实例化。

    创建一个服务
    using DependencyInjectionSample.Interfaces;

    namespace DependencyInjectionSample.Services
    {
    public class OperationService
    {
    public IOperationTransient TransientOperation { get; }
    public IOperationScoped ScopedOperation { get; }
    public IOperationSingleton SingletonOperation { get; }
    public IOperationSingletonInstance SingletonInstanceOperation { get; }

    public OperationService(IOperationTransient transientOperation,
    IOperationScoped scopedOperation,
    IOperationSingleton singletonOperation,
    IOperationSingletonInstance instanceOperation)
    {
    TransientOperation = transientOperation;
    ScopedOperation = scopedOperation;
    SingletonOperation = singletonOperation;
    SingletonInstanceOperation = instanceOperation;
    }
    }
    }
    创建一个控制器
    using DependencyInjectionSample.Interfaces;
    using DependencyInjectionSample.Services;
    using Microsoft.AspNetCore.Mvc;

    namespace DependencyInjectionSample.Controllers
    {
    public class OperationsController : Controller
    {
    private readonly OperationService _operationService;
    private readonly IOperationTransient _transientOperation;
    private readonly IOperationScoped _scopedOperation;
    private readonly IOperationSingleton _singletonOperation;
    private readonly IOperationSingletonInstance _singletonInstanceOperation;

    public OperationsController(OperationService operationService,
    IOperationTransient transientOperation,
    IOperationScoped scopedOperation,
    IOperationSingleton singletonOperation,
    IOperationSingletonInstance singletonInstanceOperation)
    {
    _operationService = operationService;
    _transientOperation = transientOperation;
    _scopedOperation = scopedOperation;
    _singletonOperation = singletonOperation;
    _singletonInstanceOperation = singletonInstanceOperation;
    }

    public IActionResult Index()
    {
    // viewbag contains controller-requested services
    ViewBag.Transient = _transientOperation;
    ViewBag.Scoped = _scopedOperation;
    ViewBag.Singleton = _singletonOperation;
    ViewBag.SingletonInstance = _singletonInstanceOperation;

    // operation service has its own requested services
    ViewBag.Service = _operationService;
    return View();
    }
    }
    }
    两个不同的请求结果

    总结:

    Transient创建的对象总是不同的,每一个服务和每个控制器都创建一个不同的实例。

    Scoped创建的对象在同一个请求会话时是相同的,每一个不同的会话创建一个不同的实例。

    Singleton创建的对象在所有的地方所有的请求会话创建的都是不同的。

    原文:https://blog.csdn.net/loongsking/article/details/79964352

  • 相关阅读:
    无参考数据集
    dropout层
    postgresql查询表的大小
    vue 消息订阅与发布
    echarts实现pie自定义标签
    elementUI 时间线居左显示
    css+div实现各种常见边框
    css实现中括号边框
    div中多行内容垂直居中显示
    vue 实现组件全屏展示及退出
  • 原文地址:https://www.cnblogs.com/littlewrong/p/10578964.html
Copyright © 2011-2022 走看看