ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象、中间件对象,以及ASP.NET Core MVC应用中的Controller对象和View对象等,所以我们可以在定义它们的时候采用注入的形式来消费已经注册的服务。下面简单介绍几种服务注入的应用场景。
00
广而告之
本篇文章节选自《ASP.NET Core 3框架揭秘》,针对本书的5折优惠还有最后2天,有兴趣可以扫描下方二维码或者从这里入群购买。
01
Startup构造器
目标读者
构成HostBuilderContext上下文的两个核心对象(表示配置的IConfiguration对象和表示承载环境的IHostEnvironment对象)可以直接注入Startup构造函数中进行消费。由于ASP.NET Core应用中的承载环境通过IWebHostEnvironment接口表示,IWebHostEnvironment接口派生于IHostEnvironment接口,所以也可以通过注入IWebHostEnvironment对象的方式得到当前承载环境相关的信息。
我们可以通过一个简单的实例来验证针对Startup的构造函数注入。如下面的代码片段所示,我们在调用IWebHostBuilder接口的Startup<TStartup>方法时注册了自定义的Startup类型。在定义Startup类型时,我们在其构造函数中注入上述3个对象,提供的调试断言不仅证明了3个对象不为Null,还表明采用IHostEnvironment接口和IWebHostEnvironment接口得到的其实是同一个实例。
class Program
{static void Main(){Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>()).Build().Run();}
}public class Startup
{public Startup(IConfiguration configuration, IHostEnvironment hostingEnvironment, IWebHostEnvironment webHostEnvironment){Debug.Assert(configuration != null);Debug.Assert(hostingEnvironment != null);Debug.Assert(webHostEnvironment != null);Debug.Assert(ReferenceEquals(hostingEnvironment, webHostEnvironment));}public void Configure(IApplicationBuilder app) { }
}
02
Startup.Configure方法
..目标读者
依赖服务还可以直接注入用于注册中间件的Configure方法中。如果构造函数注入还可以对注入的服务有所选择,那么对于Configure方法来说,通过任意方式注册的服务都可以注入其中,包括通过调用IHostBuilder、IWebHostBuilder和Startup自身的ConfigureServices方法注册的服务,还包括框架自行注册的所有服务。
如下面的代码代码片段所示,我们分别调用IWebHostBuilder和Startup的ConfigureServices方法注册了针对IFoo接口和IBar接口的服务,这两个服务直接注入Startup的Configure方法中。另外,Configure方法要求提供一个用来注册中间件的IApplicationBuilder对象作为参数,但是对该参数出现的位置并未做任何限制。
class Program
{static void Main(){Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>().ConfigureServices(svcs => svcs.AddSingleton<IFoo, Foo>())).Build().Run();}
}public class Startup
{public void ConfigureServices(IServiceCollection services) => services.AddSingleton<IBar, Bar>();public void Configure(IApplicationBuilder app, IFoo foo, IBar bar){Debug.Assert(foo != null);Debug.Assert(bar != null);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310919.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
ASP.NET Core 3.x - 为什么采用新的 Endpoint Routing 路由系统
《C++ Primer》10.1节练习
Asp.Net Core AuthorizeAttribute 和AuthorizeFilter 跟进及源码解读
1张手稿图讲明白 Kubernetes 是怎么运行的
就喜欢用vSphere部署K8s集群,不全是因为自动化!
同源策略_如何支持跨域
企业数字化转型解决方案
网站 asp和php的用途,asp和php都有什么功能?
ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制
java获取主机信息大全,网络编程:Java获取网络主机信息
【项目升级】单库、多库、读写分离 · 任你选
.Net微服务实战之技术选型篇
autohotkey php,Autohotkey+php实现免浏览器听录音
.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...
Dapper操作MySQL数据库获取JSON数据中文乱码
C++set容器去重法
流传在程序员中的传说,你知道几个?
C++关于getline()和getchar()的小点
谁说docker-compose不能水平扩展容器、服务多实例?
.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...
- 【Linux】Linux入门实操——进程管理(重点)
- 【前端知识】Javascript前端框架Vue入门
- react 使用中注意事项提要
- 【MySQL】避免执行SQl文件后自动转化表名为小写字母
- 移动应用开发:使用Android Studio 实现登录页与注册页跳转
- tdengine学习笔记-建库和建表
- [读书笔记]大型分布式网站架构设计与实践.分布式缓存
- Unexpected end of JSON input while parsing near错误解决方式(网上的方法)
- 前嗅ForeSpider教程:创建模板
- 用maven profile实现环境配置切换
- Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...
- Chrome插件:React Developer Tools为React开发调试而生