使用ASP.NET Core DI解决实例 Dovov编程网
Startup
类有几个选项。
注入依赖关系
运行时可以在Startup
类的构造函数中注入运行时服务,如IHostingEnvironment
和IServiceProvider
。
服务也可以在Configure()
方法中注入。 您可以在IApplicationBuilder
参数之后添加任意数量的参数。 您也可以在这里注入您在ConfigureServices()
方法中注册的自己的服务。 然而, ConfigureServices()
方法不允许注入服务,它只接受一个IServiceCollection
参数。
手动解决依赖关系
如果要手动parsing服务,可以让运行时在构造函数和Configure()
方法中注入一个IServiceProvider
实例:
public Startup(IServiceProvider serviceProvider) { var hostingEnv = serviceProvider.GetService<IHostingEnvironment>(); }
要么
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) { var hostingEnv = serviceProvider.GetService<IHostingEnvironment>(); }
但是,如果您需要在ConfigureServices()
方法中parsing服务,则需要使用不同的方法。 您可以从IServiceCollection
实例构build一个中间的IServiceProvider
,其中包含在此之前注册的服务:
public void ConfigureService(IServiceCollection services) { services.AddSingleton<ISomeService, SomeService>(); // Build the intermediate service provider var sp = services.BuildServiceProvider(); var service = sp.GetService<ISomeService>(); }
你需要这个Microsoft.Extensions.DependencyInjection
包。
手动parsing实例涉及使用IServiceProvider
接口:
解决Startup.ConfigureServices中的依赖关系
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IMyService, MyService>(); var serviceProvider = services.BuildServiceProvider(); var service = serviceProvider.GetService<IMyService>(); }
解决Startup.Configure中的依赖关系
public void Configure( IApplicationBuilder application, IServiceProvider serviceProvider) { // By type. var service1 = (MyService)serviceProvider.GetService(typeof(MyService)); // Using extension method. var service2 = serviceProvider.GetService<MyService>(); // ... }
使用运行时注入服务
有些types可以作为方法参数注入:
public class Startup { public Startup( IHostingEnvironment hostingEnvironment, ILoggerFactory loggerFactory) { } public void ConfigureServices( IServiceCollection services) { } public void Configure( IApplicationBuilder application, IHostingEnvironment hostingEnvironment, IServiceProvider serviceProvider, ILoggerFactory loggerfactory, IApplicationLifetime applicationLifetime) { } }
如果你用一个模板生成一个应用程序,你将在Startup
类中有这样的东西:
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddMvc(); }
然后可以在其中添加依赖关系,例如:
services.AddTransient<ITestService, TestService>();
如果你想访问你的控制器上的ITestService
,你可以在构造函数中添加IServiceProvider
,并且将被注入:
public HomeController(IServiceProvider serviceProvider)
然后你可以解决你添加的服务:
var service = serviceProvider.GetService<ITestService>();
请注意,要使用通用版本,您必须在命名空间中包含扩展名:
using Microsoft.Extensions.DependencyInjection;
ITestService.cs
public interface ITestService { int GenerateRandom(); }
TestService.cs
public class TestService : ITestService { public int GenerateRandom() { return 4; } }
Startup.cs(ConfigureServices)
public void ConfigureServices(IServiceCollection services) { services.AddApplicationInsightsTelemetry(Configuration); services.AddMvc(); services.AddTransient<ITestService, TestService>(); }
HomeController.cs
using Microsoft.Extensions.DependencyInjection; namespace Core.Controllers { public class HomeController : Controller { public HomeController(IServiceProvider serviceProvider) { var service = serviceProvider.GetService<ITestService>(); int rnd = service.GenerateRandom(); }
原文地址:https://www.cnblogs.com/lonelyxmas/p/12921929.html
- 浅谈PHP 5中垃圾回收算法的演化
- POJ 2484 A Funny Game(智商博弈)
- php pathinfo()的用法
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 微信公众平台开发
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- 洛谷P2252 取石子游戏(威佐夫博弈)
- HDU 3032 Nim or not Nim?(Multi-Nim)
- POJ 2311 Cutting Game(二维SG+Multi-Nim)
- js去掉html标签和去掉字符串文本的所有的空格
- php操作memcache的使用测试总结
- linux awk命令详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Swift guard
- PyTorch实现TPU版本CNN模型
- 使用NLP检测和对抗AI假新闻
- kallisto --genomebam报错解决(GTF文件的坑)
- linux查找文件
- TCP 协议面试灵魂 12 问,问到你怀疑人生!
- 方差分析简介(结合COVID-19案例)
- mysql计算两个时间字段的时间差
- 学生党学编程,有这个开源项目就够了!
- 【最强ResNet改进系列】Res2Net:一种新的多尺度网络结构,性能提升显著
- Java中的锁以及sychronized实现机制(十)
- Web 指纹识别之路
- RedisTemplate常用集合使用说明-opsForHash(四)
- Mybatis高级查询(二):多表联合查询
- Maven配置多仓库无效?来看看这篇文章