.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?
下面这种方式,构造一个有参的Call:
builder.Services.AddTransient<Call>(x => {
return new Call(builder.Configuration["FSD:ipaddr"]);
});
这个x是啥?(用到了再研究吧,先放这里)
通过控制器的构造函数注入
Call call;
public Test2Controller(ILogger<Test2Controller> logger, Call call)
{
_logger = logger;
this.call = call;
}
这样就能拿到,刚刚实例化的call。
不过到了这里,我发现有个事情有点”怪异“,因为这个构造函数再每次Post请求的时候,都回被调用,那岂不是,Call每次都被重新构造?我是网上收了一下,发现有个网友也提出了类似的疑问,
然后有个人是这么回答的:
翻译一下:
就是说,请求之后控制器对象都会被丢弃,更别说里面的变量了。
再回头看看,AddTransient,Transient就是瞬时的意思。Http确实也是状态无关的,是个短连接,保存似乎是没有啥意义,但是这样注入是不是会减慢速度呢?不过暂时我是接受了这种说法。
配置文件的读取
上面有句代码:
builder.Configuration["FSD:ipaddr"]
这个是在读取appsettings.json配置中的内容,微软确实很贴心啊,这些东西都给配套好了啊。
{
"FSD": {
"ipaddr": "http://localhost:9051/WebService1.asmx"
}
}
主要的读取方法,入下图所示:
这里要注意以下,如果你直接读取builder.Configuration["FSD"]是不行的,会返回null,你可能需要尝试,图中第四种方式,才能读取FSD中的内容。
今天就到这,下次接着聊~~~~
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-11-05 【wpf】Page的Unloaded事件
2021-11-05 【WPF绑定2】 INotifyPropertyChanged Or 依赖属性