使用服务

在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. AngularJS入门基础——表达式

    表达式在AngularJS应用中广泛的使用,因此深入理解AngularJS如何使用并运算表达式是非常重要的.   表达式和eval非常相似,但是由于表达式由AngularJS来处理,它们有已下显著不同 ...

  2. 在Emacs中启用Fcitx输入法

    安装fcitx输入法,在 ~/.xinitrc文件中添加如下内容 (我用startx启动图形环境,所以在~/.xinitrc中配置X会话) export LC_CTYPE="zh_CN.UT ...

  3. 玩转Hook——Android权限管理功能探讨(一)

    随着Android设备上的隐私安全问题越来越被公众重视,恶意软件对用户隐私,尤其是对电话.短信等私密信息的威胁日益突出,各大主流安全软件均推出了自己的隐私行为监控功能,在root情况下能有效防止恶意软 ...

  4. WIN10文件无法自动刷新问题解决方法

    Window10系统有时候会遇到以下类似的问题 1.文件删除后,图标还在,无法自动刷新屏幕,按F5或右键菜单刷新后才消失 2.文件粘贴后,不显示,刷新后才显示 3.回收站清理后,文件图标仍显示有垃圾 ...

  5. Dream_Spark定制第二课

    Spark版本定制第2天:通过案例对SparkStreaming透彻理解之二 本期内容: 1 解密Spark Streaming运行机制 2 解密Spark Streaming架构 一切不能进行实时流 ...

  6. 【API】文件操作编程基础-CreateFile、WriteFile、SetFilePointer

    1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文 ...

  7. gcc __attribute__关键字举例之visibility【转】

    转自:https://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool&utm_medium=ref ...

  8. Linux驱动技术(五) _设备阻塞/非阻塞读写【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6377925.html 等待队列是内核中实现进程调度的一个十分重要的数据结构,其任务是维护一个链表,链表中每一个节 ...

  9. 移动端调试利器之vconsole

    说明 由于移动端项目在手机中调试时不能使用chrome的控制台,而vconsole是对pc端console的改写 使用方法 使用 npm 安装: npm install vconsole 使用webp ...

  10. thinkphp AOP(面向切面编程)

    AOP: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...