ASP.NET Core 依赖注入详细

 更新时间:2021年10月11日 15:45:44   作者:故人与猫  
这篇文章主要介绍ASP.NET Core 依赖注入,ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,这些组件会以接口的形式标准化,这些组件就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使用容器提供所需的服务,下面我们就来详细了解一下

前言:

ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,而这些组件会以接口的形式标准化,这些组件这就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使用容器提供所需的服务。要了解依赖注入容器以及它的机制,我们需要了解什么是依赖注入。

一、控制反转

说道依赖注入就不得不提控制反转(IoC)。
定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在.NET中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

二、好莱坞法则

“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。IIOC的原理就是基于好莱坞原则,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。
ASP.NET MVC开发来说,我们只需按照约定的规则(定义好的目录或命名规则)定义对应的controllerView文件即可。整个框架会根据路由规则解析的参数到目标Controller,如果目标Action方法需要呈现一个View,框架会根据约定找到对应的的View文件( .cshtml文件),对其进行动态编译生成html回复给客户端,整个框架都体现了IoC思想。

三、流程控制

IoC是将流程的控制从应用程序当中迁移到框架当中,框架利用一个引擎驱动整个流程的自动执行。应用程序无须关心工作流程的细节,它只需要启动这个引擎即可。框架会以替丁的形式提供扩展点,应用程序通过注册扩展的方式实现对某个环节的控制。一旦这个引擎(容器)被启动,注册的扩展就会自动参与整个流程的执行。

通过上面这张图不难看出IoC在其中起到的作用。
未使用前: 整个程序相互依赖,当新的需求被提出时,牵一发而动全身,这是我们最不想看到的,在小项目中还能理清关系,当需求越来越多,简直不可想象。
开始使用: 在引入第三方后,各个模块之间没有耦合关系,将依赖降至最低,所有控制都通过IoC集中控制。
使用后: 为了方便观察把中间的IoC容器拿掉后,可以看出各个模块之间已经没有耦合关系,修改单一模块后,再也不需要考虑其他模块。

四、三种依赖注入方式

1.构造器注入

构造器注入就是在构造函数中借助参数将依赖的对象注入由他创建的对象当中。平时基本都是使用其中的构造函数方式实现注入。

    public class A
    {
        public IB B { get; }
        public A(IB b) => B = b;
    }

ASP.NET Core 中的使用

   

 [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }

2.属性注入

通过标注InjectionAttribute特性的方式可以将属性设置为自动注入的依赖属性。

    public class A
    {
        public IB B { get; set; }
        [Injection]
        public IC C { get; set; }
    }

3.方法注入

同样通过标注InjectionAttribute特性的方式可以将该方法标注为注入方法。

    public class A
    {
        public IB B { get; }
        [Injection]
        public Initialize(IB b) => B = b;
    }


除了通过容器初始化服务过程中自动调用实现,我们还可以利用它实现另一种更加自由的方法注入,这种方式在ASP.NET Core中广范应用。在ASP.NET Core启动时会调用Startup对象完成中间件注册,而定义Startup类型时候不需要让他实现某个接口,所以注册Configure方法没有一个固定声明,但可以通过下面方法将任意依赖服务注册到这个方法当中。

  

  public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

五、生命周期

AddSingleton的生命周期: 项目启动-项目关闭 相当于静态类 只会有一个
AddScoped的生命周期: 请求开始-请求结束 在这次请求中获取的对象都是同一个
AddTransient的生命周期: 请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个

注意:由于AddScoped对象是在请求的时候创建的,所以不能在AddSingleton对象中使用,甚至也不能在AddTransient对象中使用。
权重: AddSingleton→AddTransient→AddScoped

六、ASP.Net Core 中自带的注入 

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IA, A>;
            services.AddSingleton<IB, B>;
            services.AddTransient<IC, C>;
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
            });
        }

注意: ASP.Net Core中的注入还是比较简单的,但是当服务变得越来越多时,手动注入就比较麻烦了,后续在介绍其他IoC框架。

到此这篇关于ASP.NET Core 依赖注入详细的文章就介绍到这了,更多相关 ASP.NET Core 依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ASP.NET Web API教程 创建域模型的方法详细介绍

    ASP.NET Web API教程 创建域模型的方法详细介绍

    本文将介绍几种常见的创建域模型的方法,有需要的朋友可以适当的参考
    2012-11-11
  • .Net性能调优-ArrayPool详情

    .Net性能调优-ArrayPool详情

    ArrayPool具有高性能 托管 数组缓冲池,可重复使用,用 租用 空间的方式代替 重新分配 数组空间的行为的特点及可以在频繁创建和销毁数组的情况下 提高性能 ,减少垃圾回收器的压力的优点,下面文章内容将详细对其做介绍,需要的朋友可以参考一下
    2021-09-09
  • 设计windows phone页面主题

    设计windows phone页面主题

    这篇文章主要介绍了设计windows phone页面主题,需要的朋友可以参考下
    2015-07-07
  • C#中string与byte[]的转换帮助类-.NET教程,C#语言

    C#中string与byte[]的转换帮助类-.NET教程,C#语言

    在写c#程序时,string和byte[]之间的转换比较烦,在移植一些老程序时感觉很不好。我在c#中使用des和tripledes时移植一块老代码时也遇到了同样的情况。为了下次不为同样的事情烦恼,就写了下面的帮助类。
    2008-03-03
  • 深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    本篇文章是对XmlSerializer 对象的Xml序列化与反序列化的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ASP.NET常用代码

    ASP.NET常用代码

    ASP.NET常用代码...
    2006-06-06
  • ASP.NET Web API教程 创建Admin视图详细介绍

    ASP.NET Web API教程 创建Admin视图详细介绍

    现在我们转入客户端,并添加一个能够使用从Admin控制器而来的数据的页面。通过给控制器发送AJAX请求的方式,该页面将允许用户创建、编辑,或删除产品
    2012-11-11
  • ASP.NET学习中常见错误总结归纳

    ASP.NET学习中常见错误总结归纳

    这篇文章主要介绍了asp.net学习过程中碰到的常见错误的解决方法,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • .NET 6 即将到来的新特性  隐式命名空间引用

    .NET 6 即将到来的新特性 隐式命名空间引用

    ASP.NET 现在我们还是需要手动加命名空间引用,在以后的版本中可能就不需要手动加命名空间的引用了,本文就来介绍.NET 6即将到来的新特性--隐式命名空间引用,,需要的朋友可以参考下面文章内容
    2021-09-09
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介绍

    asp.net mvc路由篇 如何找到 IHttpHandler方法介绍

    学习是使用asp.net已经有很长一段时间了,现在就来分析一下mvc的整过过程吧。个人计划写一个mvc系列的博文,仅从源代码的角度来分析mvc。在接触mvc时我们一定会经历路由,那么路由这东东是怎么搞出来的啊
    2012-11-11

最新评论