使用服务

在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务:

构造函数

可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。

public ValuesController(IConfiguration cfg)
    {
    }

FromService参数

也可以直接在参数中通过FromServiceAttribute引入服务,这个在Controller中用起来非常方便,可以不用再构造函数中加一个变量以保存服务。

[HttpGet]
    public string Get([FromServices] IConfiguration cfg)
    {
        //…
    }

注入服务

如果要注入我们自己的服务,可以通过如下几步实现:

定义服务接口

在DI框架中,服务一般是面向接口实现的,首先需要定义我们服务的接口:

    public interface IMyLogger
    {
        void WriteMessage(string message);
    }

虽然接口定义本身并不是必须的,我们的应用也可以直接依赖于具体的服务对象。但基于良好的设计原则,最好定义接口。

编写服务实现

定义完服务后,就需要编写服务的实现。

    public class MyLogger : IMyLogger
    {
        public void WriteMessage(string message)
        {
            Console.WriteLine(message);
        }
    }

注入服务

注入服务一般是通过IServiceCollection.Add方法来实现的。在asp.net core中,一般有如下两个入口可以注入服务。

  1. Startup.ConfigureServices回调函数中注册
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyLogger, MyLogger>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
  1. 调用IWebHostBuilder.ConfigureServices方法注册

一般会在Main函数中创建WebHost,此时可以主动注册服务。

    WebHost.CreateDefaultBuilder(args)
           .ConfigureServices(service => service.AddScoped<IMyLogger, MyLogger>())
           .UseStartup<Startup>();

我这里并没有直接使用IServiceCollection.Add方法注册,而是调用的IServiceCollection.AddScoped扩展方法,它简化了我们服务注册的过程。这个方法有三个:

  • AddTransient
  • AddScoped
  • AddSingleton

这三个方法使用方式类似,它们主要的区别是代表了不同的生命周期:

  • 暂时(Transient)    -    每次调用都会创建新实例
  • 作用域(Scoped)    -    在调用方生命周期类保持相同实例。(如同一个Controller对象在构造函数中和参数中引入的Scoped对象是相同的)
  • 单例(Singleton)    -    在Host内保持唯一

系统自带服务

Asp.net core程序启动的时候,默认就注入了一系列服务

这些服务我们可以直接通过注入的方式使用。另外,一些框架级别的服务(如IServiceProvider,IConfiguration,ILogger<T>等)也是默认可以使用的。

服务容器接口

除了在构造函数中自动获取服务外,我们还可以使用服务容器框架的API构建更为高级的操作,它一般需要用到如下对象:

  • IServiceProvider 可以在实例中通过依赖注入的方式获取
  • ActivatorUtilities 辅助构建任务实例

一个简单的示例如下:

    using (var scope = services.CreateScope())
    {
        var service = scope.ServiceProvider.GetRequiredService<IMyLogger>();
        service.WriteMessage("hello world");
    }

这种方式在asp.net core并不常用,因为系统的Web框架已经为我们处理好了大部分功能,但在我们使用通用主机构建自己的后台应用时,这些API就大有用武之地了,限于篇幅这里就不详细介绍了。

在.net core程序中使用

这个依赖注入框架本身并不是.net core的一部分,要在.net core程序中使用它,可以参考我的另一篇文章: .net core程序中使用微软的依赖注入框架

参考文章

在 ASP.NET Core 依赖注入

Asp.net core中的依赖注入的更多相关文章

  1. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  2. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  3. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  4. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  5. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

    本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...

  6. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  7. ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】

    到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...

  8. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  9. ASP.NET Core 中的 依赖注入介绍

    ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...

  10. ASP.NET Core 中的依赖注入 [共7篇]

    一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了 ...

随机推荐

  1. 一组数字,从1到n,从中减少了3个数,顺序打乱,放在n-3的数组里,找出丢失数字

    曾经看到有这样一个JS题:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里请找出丢失的数字,最好能有程序,最好算法比较快假设n=10000 下面我也来贴一个算法. func ...

  2. ASP.NET私有构造函数作用

    一.私有构造函数的特性 1.一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员. 2.私有构造函数是一种特殊的实例构造函数.它通常用在 ...

  3. spring Mvc + Maven + 拷贝插件 (十一)

    maven-antrun-plugin:可用于在项目编译打包时,把文件指定的文件拷贝到指定的位置,我们打包一般都是打包到 项目 的target 文件下; <groupId>org.apac ...

  4. 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法

    [题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...

  5. 爬虫笔记之自如房屋价格图片识别(价格字段css背景图片偏移显示)

    一.前言 自如房屋详情页的价格字段用图片显示,特此破解一下以丰富一下爬虫笔记系列博文集. 二.分析 & 实现 先打开一个房屋详情页观察一下: 网页的源代码中没有直接显示价格字段,价格的显示是使 ...

  6. [转]C++11 随机数学习

    相对于C++ 11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多.这是因为相对于之前的只需srand.rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西. 随机数生成算 ...

  7. 【源码阅读】Mimikatz相关资料

    Mimikatz GitHub (源码) https://github.com/gentilkiwi/mimikatz Mimikatz GitHub Wiki (包含了一些说明文档) https:/ ...

  8. 善用backtrace解决大问题【转】

    转自:https://www.2cto.com/kf/201107/97270.html 一.用途: 主要用于程序异常退出时寻找错误原因 二.功能: 回溯堆栈,简单的说就是可以列出当前函数调用关系 三 ...

  9. 在windows上实现多个java jdk的共存解决办法

    转自:https://www.cnblogs.com/jianyungsun/p/6918024.html 分析问题 为了多快好省的解决当前的问题,我的想法是在windows中同时安装jdk1.6和j ...

  10. 用Python连接SQLServer抓取分析数据、监控 (pymssql)

    Python 环境:python3 服务器环境: centos6.5 数据库: Mysql 大概流程:在装有Python服务器,利用pymssql库连接MSSQL生产数据库取出数据然后写进mysql数 ...