本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core

ASP.NET Core支持依赖注入,依赖注入的对象通过构造函数或者 Ioc container 内置的方法进行注入。

内置的 IoC Container

ASP.NET Core框架包含了开箱即用的 Ioc容器,这个容器相比第三方的容器功能会有不足。如果想要更多例如 auto-registration、scanning、interceptors或者decorators那么可以使用第三方的容器替换内置的Ioc容器。

内置的容器是通过 IServiceProvider 接口的实现使用,默认支持构造函数注入。内置 Ioc容器管理的类称作 services。

在ASP.NET Core存在两种类型的服务:

  • 框架服务:服务是ASP.NET Core框架的一部分,比方说 IApplicationBuilder、IHostingEnvironment、ILoggerFactory等
  • 应用服务:由开发人员创建的服务(自定义的类型或者类)

为了使 Ioc容器自动注入应用服务,首先需要在Ioc容器注册。

注册应用服务

下面用简单的 ILog 接口以及它的显示举例来说明如何使用内置的 Ioc 容器注册并在程序中使用。

   public interface ILog
2 {
void info(string str);
} class MyConsoleLogger : ILog
{
public void info(string str)
{
Console.WriteLine(str);
}
}

ASP.NET Core允许我们在 ConfigureServices 方法中使用 Ioc 容器注册应用服务, ConfigureServices 包含了一个 IServiceCollection 类型的参数,该参数可以用于应用服务的注册。

下面在 ConfigureServices()方法中使用 Ioc 容器注册 ILog 接口。

   public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));
} 8 // other code removed for clarity..
}

如上所见, IServiceCollection实例的Add()方法用于 Ioc容器的服务注册。 ServiceDescriptor用于指定服务的类型和实例,此处指定 MyConsoleLogger作为 ILog服务的实例,此处默认是按照单利注册。

现在 Ioc容器可以创建一个 MyConsoleLogger类的单利对象,我们可以通过在类的构造函数包含 ILog或者方法参数包含 ILog实现在程序中的注入。

服务的生命周期

内置的 Ioc容器管理着已经注册的服务的生命周期,服务的实例会根据指定的生命周期自动的释放。

内置的 Ioc容器支持三种生命周期:

  • Singleton:Ioc容器创建在应用的整个证明周期创建并共享同一个实例
  • Transient:每次需要调用指定的服务的时候都会重新创建
  • Scoped   :在单词请求的过程中,IOC 容器对指定的服务创建一个实例。

不同的生命周期注册方法如下:

 public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger())); // singleton services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient)); // Transient services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped)); // Scoped
}

注册的扩展方法

ASP.NET Core框架对于每种类型的生命周期都有对应的扩展方法:AddSingleton()AddTransient() 和 AddScoped()。

使用扩展方法注册

 public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ILog, MyConsoleLogger>();
services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger)); services.AddTransient<ILog, MyConsoleLogger>();
services.AddTransient(typeof(ILog), typeof(MyConsoleLogger)); services.AddScoped<ILog, MyConsoleLogger>();
services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}

构造函数注入

当我们注册一个服务时,如果构造函数包含某一类型的服务,该服务会被 IOC容器自动的注册。

 public class HomeController : Controller
{
ILog _log; public HomeController(ILog log)
{
_log = log;
}
public IActionResult Index()
{
_log.info("Executing /home/index"); return View();
}
}

上面的代码中,IOC容器自动的向HomeController的构造函数传递 MyConsoleLogger 的实例。这里不需要做额外的事情,IOC容器会根据注册的生命周期创建并释放 ILog的实例 。

Action方法注入

有时我们只是在单个的Action方法中需要依赖的服务,此时可以使用 [FromServices] 属性。

using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{
public HomeController()
{
} public IActionResult Index([FromServices] ILog log)
{
log.info("Index method executing"); return View();
}
}

属性注入

内置的 IOC 容器并不支持属性注入,需要第三方的 IOC容器。

手动获取服务

属性注入不需要在构造函数包含依赖的方法。我们可以使用内置的IOC容器,使用HttpContext的RequestServices属性手动的获取依赖服务。

 public class HomeController : Controller
{
public HomeController()
{
}
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var log = (ILog)services.GetService(typeof(ILog)); log.info("Index method executing"); return View();
}
}

推荐使用构造注入而非 RequestServices获取。

ASP.NET Core之依赖注入的更多相关文章

  1. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

  2. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  3. 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

    这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...

  4. ASP.NET Core:依赖注入

    ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...

  5. Asp.net core自定义依赖注入容器,替换自带容器

    依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...

  6. asp.net core ioc 依赖注入

    1.生命周期 内置的IOC有三种生命周期: Transient: Transient服务在每次被请求时都会被创建.这种生命周期比较适用于轻量级的无状态服务. Scoped: Scoped生命周期的服务 ...

  7. .Net Core 使用依赖注入

    ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的 ...

  8. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

  9. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

随机推荐

  1. UITouch - BNR

    本节任务:创建一个视图,让用户在视图上拖动手指来画线. UIView类能够重载4个方法来处理不同的触摸事件. - (void)touchesBegan:(NSSet *)touches withEve ...

  2. python json库序列化支持中文

    import json d = {"name":"英雄无敌7"} res = json.dumps(d) # 打印res 会显示 {"name&quo ...

  3. 静态类(C#)

    基本简介: 类可以声明为 static 的,以指示它仅包含静态成员.不能使用 new 关键字创建静态类的实例.静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 ( ...

  4. [Alpha阶段]第五次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第五次Scrum Meeting 基本信息 名称 时间 地点 时长 第五次Scrum Meeting 19/04/09 教1_2楼教室 65min ...

  5. Kubernetes — 作业副本与水平扩展

    Deployment 看似简单,但实际上,它实现了 Kubernetes 项目中一个非常重要的功能:Pod 的“水平扩展 / 收缩”(horizontal scaling out/in). 这个功能, ...

  6. k8s简单的来部署一下tomcat,并测试自愈功能

    前言: 2018年12月6日 今天终于把k8s运行tomcat打通了,耗了我几天时间一个一个坑踩过来,不容易啊,废话不多说. 先记录一些操作时的错误: <<<<<< ...

  7. html5 基础入门

    html5 基础入门 前言介绍 HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML工作团队. 如果从狭 ...

  8. 阶梯Nim问题

    问题形式 有\(n\)个位置\(1...n\),每个位置上有\(a_i\)个石子.有两个人轮流操作.操作步骤是:挑选\(1...n\)中任一一个存在石子的位置\(i\),将至少1个石子移动至\(i-1 ...

  9. JDK源码分析(7)String

    String String表示字符串,Java中所有字符串的字面值都是String类的实例,例如"ABC".字符串是常量,在定义后不能被改变,字符串缓冲区支持可变的字符串.因为St ...

  10. FreeNAS-9.10虚拟机测试安装

     虚拟机安装NreeNAS-9.10步骤 需求:网络监控磁盘要扩容 测试环境: CPU 内存 系统盘 共享盘 网卡 2核 2G 20G 20G 桥接 系统版本:FreeNAS-9.10 一.配置虚拟机 ...