ASP.NET Core 2.0 依赖注入

问题

如何使用 ASP.NET Core 服务容器进行依赖注入?

答案

创建一个服务

public interface IGreetingService
{   
 
string Greet(string to); }

public class GreetingService : IGreetingService {  
    
public string Greet(string to){        return $"Hello {to}";} }


然后可以在需要的时候注入,下面将此服务注入一个中间件(Middleware):

public class HelloWorldMiddleware
{   
   
private readonly RequestDelegate _next;  

   
public HelloWorldMiddleware(RequestDelegate next){_next = next;}  

   
public async Task Invoke(HttpContext context, IGreetingService greetingService){      
  
var message = greetingService.Greet("World (via DI)");   await context.Response.WriteAsync(message);} }

使用此中间件的扩展方法(IApplicationBuilder):

public static class UseMiddlewareExtensions
{    
   
public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder app){        return app.UseMiddleware<HelloWorldMiddleware>();} }

下面需要将此服务添加到ASP.NET Core的服务容器中,位于Startup.cs文件的ConfigureServices()方法:

public void ConfigureServices(IServiceCollection services)
{services.AddScoped<IGreetingService, GreetingService>();
}

然后在请求管道中(request pipeline)使用此中间件,位于Startup.cs文件的Configure()方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.UseHelloWorld();
}

运行,此时页面输出:

 

创建一个带输入参数的服务

如果你的服务需要更复杂的初始化参数,下面我们创建一个FlexibleGreetingService:


public class FlexibleGreetingService : IGreetingService
{   
   
private readonly string _sayWhat;  

  
public FlexibleGreetingService(string sayWhat){_sayWhat = sayWhat;}  

   
public string Greet(string to){      
      
return $"{_sayWhat} {to}";} }


我们可以使用AddScoped的一个重载工厂方法来添加此服务到容器中:

public void ConfigureServices(IServiceCollection services)
{services.AddScoped<IGreetingService, FlexibleGreetingService>(factory =>{       
return new FlexibleGreetingService("Hi");}); }

运行,此时页面输出:

如果是单件生命周期,还有一个接受服务实例的重载方法:

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<IGreetingService>(new FlexibleGreetingService("Hi "));
}

 

讨论

 ASP.NET Core内置了一个轻量级的服务容器。我们可以在Startup.cs类的ConfigureServices()方法中配置需要的服务。这个方法在Configure()方法之前执行,所以我们可以在任意中间件使用之前配置的服务(包含MVC服务)。

依赖注入默认是通过公开构造函数来完成的,大多数情况下这是最佳实践。

服务的生命周期

服务容器管理着添加到服务器列表的生命周期。下面列出了添加服务的三种方法:

  • AddScoped():服务会在一个请求内部只创建一次。

  • AddTransient():服务会在每次需要时创建一次。

  • AddSingleton():服务会在第一次需要时创建一次,并在随后保持不变。

注:EF的生命周期应该是Scoped,我们可以通过IServiceCollection.AddDbContext来创建EF服务(内部也是作为Scoped实现)。

工厂方法

上面的方法都有一个重载方法来使用工厂方法来添加服务。对于需要复杂配置的服务这是很有用的。

这些方法的签名看起来如下所示:

AddScoped(Func<IServiceProvider, TService>)

框架提供的服务

ConfigureServices()接受的IServiceCollection参数拥有很多内置的服务(由框架提供),可以参考ASP.NET Core文档。

IServiceCollection有很多有用的扩展方法来添加常用服务,比如AddDbContext,AddIdentity,AddOptions和AddMvc。

销毁服务

服务容器会自动调用所有实现了IDisposable接口的服务类型,除了那些作为实例(而不是类型)添加的服务。

获取服务(Request Services)

尽管通过构造函数来注入服务被认为是最佳实践,我们依然可以通过IServiceProvider的GetService方法来获取服务。在中间件中IServiceProvider对象可以通过HttpContext来获取:

public async Task Invoke(HttpContext context)
{   
 
var greetingService = context.RequestServices.GetService<IGreetingService>();    var message = greetingService.Greet("World (via GetService)");  
 
await context.Response.WriteAsync(message); }


注:需要添加Microsoft.Extensions.DependencyInjection引用才能上述使用GetService的泛型重载方法。

运行,此时页面输出:

原文地址:http://www.cnblogs.com/sanshi/p/7705617.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试 - 要不简单聊一下你对MySQL索引的理解?

转载自 面试 &#xff0d; 要不简单聊一下你对MySQL索引的理解&#xff1f; MySQL索引&#xff1f;这玩意儿还能简单聊&#xff1f;明显是在挖坑&#xff0c;幸好老夫早有准备&#xff0c;切听我一一道来。 一、索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 二、…

ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi

项目&#xff1a;asp.net zero 4.2.0 .net core&#xff08;1.1&#xff09; 版本 我们做项目的时候可能会遇到需要提供api给app调用&#xff0c;ABP动态生成的WebApi提供了方便的基于JWT标准的Token访问方式供我们访问API&#xff0c;不用在代码上做任何改动&#xff0c;很方便…

ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

好消息&#xff01;特好消息&#xff01;同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦&#xff01; 是的&#xff0c;你没有看错&#xff01;ASP.NET Core 2.0&#xff0c;.NET Framework类库&#xff0c;linux通通都给你&#xff0c;不要998只要…

面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波

转载自 面试被问Mysql没答上来&#xff1f;阿里P5:总结了55道常见面试题&#xff0c;收藏一波 正文开始前&#xff0c;分享阿里 P8 高级架构师吐血总结的 《Java 核心知识体系&面试资料.pdf》, 非卖课程的哟&#xff01; 阿里 P8 级高级架构师吐血总结的一份 Java 核心知…

开源纯C#工控网关+组态软件(四)上下位机通讯原理

一、 网关的功能&#xff1a;承上启下 最近有点忙&#xff0c;更新慢了。感谢园友们给予的支持&#xff0c;现在github上已经有。目标是最好的开源组态&#xff0c;看来又近一步^^ 之前有提到网关是物联网的关键环节&#xff0c;它的作用就是承上启下。 下位机有下位机的语言…

微软Tech Summit 2017,等你来打Call

2017年10月31至11月3日&#xff0c;由微软举办的Tech Summit 2017技术暨生态大会将在北京盛大举办&#xff0c;要在北京连开四天。今年的技术大会看头十足&#xff0c;不仅有大咖级人物带来十二大主题课程&#xff0c;更有三天四场的主题之夜。微软技术大会最早是由微软技术教育…

ABP从入门到精通(5):.扩展国际化语言资源

ABP的有些组件使用的该组件自带的语言包资源&#xff0c;所以在有些时候会因为我们当前使用的语言对应的语言包不全&#xff0c;而造成日志一直记录WARN。ABP给我们提供了扩展语言包资源的接口&#xff0c;可以解决这个问题。 以下示例代码适用于ABP .net core版本。我要为名为…

CoreCLR源码探索(八) JIT的工作原理(详解篇)

在上一篇 我们对CoreCLR中的JIT有了一个基础的了解,这一篇我们将更详细分析JIT的实现. JIT的实现代码主要在https://github.com/dotnet/coreclr/tree/master/src/jit下, 要对一个的函数的JIT过程进行详细分析, 最好的办法是查看JitDump. 查看JitDump需要自己编译一个Debug版本的…

【php】正则无法截取\反斜杠的解决方法

今天想将上次的图片上传功能优化一下&#xff0c;遇到一个问题&#xff0c;获取临时文件的名字时&#xff0c;由于名字中不能有\&#xff0c;所以必须对获取的文件名进行剪切&#xff0c;本人没有系统学习过php&#xff0c;所以有些知识点还是得重新学习。 获取到得字符串&…

学习Identity Server 4的预备知识

我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去.这里需要使用identity server 4 做单点登陆.下面就简单学习一下相关的预备知识. 基于Token的安全验证体系 这个比较简单, 简单来说就是为了证明我们有访问权限, 我们首先需要获得一个token. …

帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

转载自 帮你彻底搞懂JS中的prototype、__proto__与constructor&#xff08;图解&#xff09;   作为一名前端工程师&#xff0c;必须搞懂JS中的prototype、__proto__与constructor属性&#xff0c;相信很多初学者对这些属性存在许多困惑&#xff0c;容易把它们混淆&#xff…

【Php】最最简单的php环境搭建

Wamp是apachemysqlphp的集成环境&#xff0c;通过一键安装程序&#xff0c;可以完全免除配置的烦恼。 链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1717Mw66Z1wZ67ltLriUVew 提取码&#xff1a;7h5t 下载之后一直下一步&#xff0c;默认默认即可 如果输入local…

浅析C#中单点登录的原理和使用

是单点登录&#xff1f; 我想肯定有一部分人“望文生义”的认为单点登录就是一个用户只能在一处登录&#xff0c;其实这是错误的理解&#xff08;我记得我第一次也是这么理解的&#xff09;。 单点登录指的是多个子系统只需要登录一个&#xff0c;其他系统不需要登录了&#xf…

Mybatis入门程序增删改查操作

学习目标 了解Mybatis的基本知识熟悉Mybatis的工作原理掌握Mybatis入门程序的编写 文章目录 1.初始Mybatis 2.Mybatis入门程序 3.Mybatis操作总结 1.初始Mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所…

ASP.NET Core 2.0 全局配置项

问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项&#xff1f; 答案 首先新建一个空项目&#xff0c;并添加两个配置文件&#xff1a; 1. appsettings.json { "Section1": { "SettingA": "ValueA", "SettingB": "V…

Auto.JS 教程

最近淘宝双十一活动来了&#xff0c;有个自动领猫币的脚本&#xff0c;基于auto.js&#xff0c;亲测有效。有兴趣的点这里 声明&#xff1a; 本教程基于b站up主-笔青居的视频。传送门&#xff1a;https://space.bilibili.com/21486893/video Auto.JS Auto.js 是个基于 JavaScri…

本土开源、立足全球 | COSCon'17

全球公有云 90% 的服务器运行的是开源 Linux 操作系统&#xff01; GitHub 上有超过 150 万个组织&#xff0c;正在进行开源开发&#xff01; 本土开源项目目前在 Apache 的顶级以及孵化列表中已经有 6 个&#xff01; 你想知道这其中都有什么奥秘吗&#xff1f;Apache 顶级项目…

Wamp升级php到7.3版本

在网上找了关于cms的模板&#xff0c;结果显示php版本低于7.2的无法使用。 找了很多wamp和xampp的安装包&#xff0c;要不然版本没到7.2&#xff0c;要不然安装无法使用&#xff0c;浪费了很多时间 于是想自己手动把php升到7.3版本&#xff0c;刚开始看教程&#xff0c;特别麻烦…

浅析Entity Framework Core中的并发处理

前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处理策略 要了解如何处理并发,就要知道并发的一般处理策略 悲观并发策略 悲观并发策略,正如其名,它指的是对数据被外界&…

Mybatis的关联映射

学习目标 了解数据表之间以及对象之间的三种关联关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一、一对多和多对多关联映射的使用文章目录 1. 关联关系概述 2. 一对一 3.一对多 4. 多对多 1. 关联关系概述 一对一的关系&#xff1a;就是在本类中定义对方类型的对象一对…