• .net6 WebApi 如何将变量注入到控制器 以及配置文件的读取


    前言

    WebApi 的套路还是很直白的,入门还是比较简单。

    一个顶级文件Program.cs负责初始化配置工作,再配上几个控制器,就能写出微服务了。

    今天介绍两个小技巧:

    1 如何将变量注入到控制器

    2 配置文件的读取

    如何将变量注入到控制器

    比如我在顶级文件Program.cs中初始化一个变量,怎么传到控制器呢?答案是注入。

    不像wpf要借助prsim这类的框架,.net6提供的原始的WebApi就自带容器,我们可以方便的进行依赖注入。

    比如我有一个类叫做Call,构造一个Call需要一个ip地址,而这个地址是写入appsettings.json配置文件的。

    我的想法是,在Program.cs中读取配置,然后构造Call,然后再通过控制器的构造函数注入Call对象。

    先添加注册:

    builder.Services.AddTransient();

    但是这个构造的是无参的Call,怎么构造有个有参的Call?

    下面这种方式,构造一个有参的Call:

    1. builder.Services.AddTransient(x => {
    2. return new Call(builder.Configuration["FSD:ipaddr"]);
    3. });

     这个x是啥?(用到了再研究吧,先放这里) 

    通过控制器的构造函数注入

    1. Call call;
    2. public Test2Controller(ILogger logger, Call call)
    3. {
    4. _logger = logger;
    5. this.call = call;
    6. }

    这样就能拿到,刚刚实例化的call。

    不过到了这里,我发现有个事情有点”怪异“,因为这个构造函数再每次Post请求的时候,都回被调用,那岂不是,Call每次都被重新构造?我是网上收了一下,发现有个网友也提出了类似的疑问,

    然后有个人是这么回答的:

     

    翻译一下:

     

    就是说,请求之后控制器对象都会被丢弃,更别说里面的变量了。 

    再回头看看,AddTransient,Transient就是瞬时的意思。Http确实也是状态无关的,是个短连接,保存似乎是没有啥意义,但是这样注入是不是会减慢速度呢?不过暂时我是接受了这种说法。

     配置文件的读取

    上面有句代码:

    builder.Configuration["FSD:ipaddr"]

    这个是在读取appsettings.json配置中的内容,微软确实很贴心啊,这些东西都给配套好了啊。

    1. {
    2. "FSD": {
    3. "ipaddr": "http://localhost:9051/WebService1.asmx"
    4. }
    5. }

    主要的读取方法,入下图所示: 

     这里要注意以下,如果你直接读取builder.Configuration["FSD"]是不行的,会返回null,你可能需要尝试,图中第四种方式,才能读取FSD中的内容。

    今天就到这,下次接着聊~~~~

  • 相关阅读:
    pytorch中unsqueeze用法说明
    (C语言)fscanf与fprintf函数详解
    11.7 - 每日一题 - 408
    【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统
    讲述为什么要学习Adobe XD以及 Adobe XD下载安装
    内部人员是企业最大“漏洞”,密码保护数据的方式极其脆弱
    MYSQL DQL in 到底会不会走索引&in 范围查询引发的思考。
    一次请求的来龙去脉 - Tomcat架构解析(一)
    获取Qt的安装信息:包括安装目录及各种宏地址
    Python深度学习入门 - - Transformers网络学习笔记
  • 原文地址:https://blog.csdn.net/songhuangong123/article/details/127700033