Asp.net core中的依赖注入

栏目: ASP.NET · 发布时间: 7年前

内容简介:在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务:构造函数可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。

使用服务

在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就大有用武之地了,限于篇幅这里就不详细介绍了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Visual Thinking

Visual Thinking

Colin Ware / Morgan Kaufmann / 2008-4-18 / USD 49.95

Increasingly, designers need to present information in ways that aid their audiences thinking process. Fortunately, results from the relatively new science of human visual perception provide valuable ......一起来看看 《Visual Thinking》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具