首页 > 编程语言 >ASP.NET Core Web (三) 依赖注入

ASP.NET Core Web (三) 依赖注入

时间:2023-09-27 16:16:00浏览次数:48  
标签:Core ASP AddSingleton Web serviceProvider dateTime 实例 IServiceProvider public

依赖注入

注入方法 方法说明
AddTransient 每次service请求都是获得不同的实例,暂时性模式
AddScoped 对于同一个请求返回同一个实例,不同的请求返回不同的实例,作用域模式
AddSingleton 每次都是获得同一个实例, 单一实例模式
MVC控制器的DI
  1. 构造函数输入

    • 创建接口

      public interface IDateTime
      {
          DateTime Now { get; }
      }
      
    • 实现接口

      public class SystemDateTime : IDateTime
      {
          public DateTime Now
          {
              get { return DateTime.Now; }
          }
      }
      
    • 添加到容器

      services.AddSingleton<IDateTime, SystemDateTime>();	
      
    • Controller调用

      public class HomeController : Controller
      {
          private readonly IDateTime _dateTime;
          // 引用单例
          public HomeController(IDateTime dateTime)
          {
              _dateTime = dateTime;
          }
      }
      
  2. 使用FromServices 注入

    public IActionResult About([FromServices] IDateTime dateTime)
    {
        return Content( $"Current server time: {dateTime.Now}");
    }
    
  3. 控制器访问控制

    • 创建entity类

      public class SampleWebSettings
      {
          public string Title { get; set; }
          public int Updates { get; set; }
      }
      
    • 配置类添加到服务集合

      services.Configure(Configuration);

    • 从 JSON 格式文件中读取设置

      Host.CreateDefaultBuilder(args)
                  .ConfigureAppConfiguration((hostingContext, config) =>
                  {
                      config.AddJsonFile("samplewebsettings.json",
                          optional: false,
                          reloadOnChange: true);
                  })
                  .ConfigureWebHostDefaults(webBuilder =>
                  {
                      webBuilder.UseStartup<Startup>();
                  });
      
    • 使用

      public class SettingsController : Controller
      {
          private readonly SampleWebSettings _settings;
      
          public SettingsController(IOptions<SampleWebSettings> settingsOptions)
          {
              _settings = settingsOptions.Value;
          }
      
          public IActionResult Index()
          {
              ViewData["Title"] = _settings.Title;
              ViewData["Updates"] = _settings.Updates;
              return View();
          }
      }
      
.NET Core的DI
  1. 服务注册

    方法 自动释放 多种实现 传递参数
    AddSingleton<IMyDep, MyDep>();
    AddSingleton(sp => new MyDep(99));
    AddSingleton();
    services.AddSingleton(new MyDep(99));
    services.AddSingleton(new MyDep(99));
  2. 构造函数注册

    • IServiceProvider

      public class ProductService
      {
          // 声明需要注入的类
          private readonly IProductRepository _productRepository;
          private readonly IProductService _productService;
          // 构造函数中获得serviceProvider
          public ProductService(IServiceProvider serviceProvider)
          {
              // serviceProvider通过调用实现注入
             _productRepository = serviceProvider.GetRequiredService<IProductRepository>();  
              _productService = serviceProvider.GetService(typeof(ProductService)) as IProductRepository;
              // 或者
              _productService = serviceProvider.GetService<ProductService, IProductService>();
          }
      }
      
    • ActivatorUtilities

      激活器服务的帮助程序代码

      方法名 说明
      CreateFactory(Type, Type[]) 创建一个委托,该委托将使用直接和/或从 IServiceProvider 提供的构造函数参数实例化类型
      CreateInstance(IServiceProvider, Type, Object[]) 使用直接提供的或从 IServiceProvider提供的构造函数参数实例化类型。
      GetServiceOrCreateInstance(IServiceProvider) 从服务提供程序中检索给定类型的实例。 如果找不到该实例,则直接实例化

标签:Core,ASP,AddSingleton,Web,serviceProvider,dateTime,实例,IServiceProvider,public
From: https://www.cnblogs.com/wanghun315/p/17732918.html

相关文章

  • ASP.NET Core Web (中间件)
    中间件中间件类似于装配器,请求处理管道由一系列的中间件组件组成,每个组件在HttpContext上执行操作,按顺序调用管道中的下一个中间件或结束,特定的中间件在通道中装配以后可以获取数据并进行一系列的操作。该图表示request到response的相关流程,每个节点的输入输出。通过调用Use{F......
  • WEBRTC回声消除-AECM算法源码解析之参数解析
    一概述 webrtc针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc中的地位,而aecm主要是针对计算能力较弱的移动端或是嵌入式设备而开发的,但同时也带来了它自己的劣势;本文主要介绍AECM算法的计......
  • jenkins自动部署web项目到tomcat 和 本地启动不一致 tomact log中文乱码
    最近项目使用jenkins来自动化部署,部署后发现catalina.out日志中文是乱码的。如果使用手动部署不经过Jenkins的话项目就一切正常。所以我想有可能是因为jenkins部署的时候,导致目标服务器那边获取不到相应的环境变量。在tomcat日志中发现,手动启动使用的是自己安装的JDK,而用jenkins......
  • 基于web房屋租售管理系统-计算机毕业设计源码+LW文档
    摘 要当今,在这个信息化的时代,人们的生活越来越便利。因此如果运用java技术建设房屋租售管理系统系统使其与互联网有效的结合起来,实现房屋租售管理系统系统的网络化,为学校师生乃至社会提供更为全面、便捷的服务。根据本系统的研究现状和发展方向,首先系统从需求分析、结构设计、数......
  • 向目标输入框输入值(WebDriverWait判断是否有该输入框)
    #导包fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromtimeimportsleepfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC#浏览器驱动driver=webdriver.Ch......
  • Selenium进阶——解决web 自动化中上传文件的问题
    在做ui自动化测试中,经常会遇到上传文件或者图片的场景,通常的解决方案是自动化工具+autoIT,在这里我介绍一种通过jdk自带api——java.awt.Robot来解决类似问题的方法。java.awt.Robot类主要用于模拟用户点击键盘上的按键,或者模拟用户敲击鼠标等动作。在做web测试时,弹出窗口如下图所......
  • AspNetCore不明确的匹配异常-请求与多个终结点匹配
    框架:net6.0AspNetCoreMVC添加区域控制器HomeController,直接启动报错;因默认路由下存在相同的控制器HomeController(非区域的),需要修改路由映射配置;在Program.cs添加区域路由配置app.MapAreaControllerRoute(name:"areaRoute",areaName:"Admin",pattern:......
  • 12-web前端轮播图案例 (小米商城)
    说明:轮播图在前端开发中是一种常见的元素,通常用于展示一系列的图片或者内容,并通过滑动或者点击的方式进行切换。使用JavaScript来实现轮播图有以下几个意义:提升用户体验:轮播图可以在有限的空间内展示更多的内容,为用户提供更多的信息。同时,轮播图也具有较好的视觉效果,可以吸引用......
  • webpack介绍
    (1).构建工具的作用:转换ES6语法.转换JSX.CSS前缀补全、预处理器.压缩混淆.图片压缩.1.静态模块打包器:将入口文件引入的各种资源=>chunk(块)=>less转换为css、es6转换为es5=>bundle(输出内容)将所有资源文件(js/css/html/less/json...)当做模块处理.根据模块的依赖......
  • vite_vite.config.js配置代理与websocket代理
    exportdefaultdefineConfig({server:{proxy:{"/proxy":{target:"http://121.10.140.87",//线上服务器IP地址changeOrigin:true,ws:true,rewrite:(p......