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 依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .NET 6新特性试用Timer类之PeriodicTimer 

    .NET 6新特性试用Timer类之PeriodicTimer 

    这篇文章主要介绍了.NET 6新特性试用Timer类之PeriodicTimer,PeriodicTimer与其他Timer需要创建事件回调不同,下,下面文章详细介绍PeriodicTimer的使用方式,需要的朋友可以参考一下
    2022-02-02
  • C#中string与byte[]的转换帮助类-.NET教程,C#语言

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

    在写c#程序时,string和byte[]之间的转换比较烦,在移植一些老程序时感觉很不好。我在c#中使用des和tripledes时移植一块老代码时也遇到了同样的情况。为了下次不为同样的事情烦恼,就写了下面的帮助类。
    2008-03-03
  • ASP.NET热点问题解答14个

    ASP.NET热点问题解答14个

    ASP.NET热点问题解答14个...
    2006-07-07
  • .Net Core 之AutoFac的使用

    .Net Core 之AutoFac的使用

    本文简单介绍了AutoFac的基本使用以及在asp .net core中的应用,文中通过代码讲解相关知识非常的详细,对大家的学习或工作都很有帮助,感兴趣的小伙伴可以参考一下这篇文章
    2021-09-09
  • Oracle中TO_DATE格式介绍

    Oracle中TO_DATE格式介绍

    Oracle中TO_DATE格式介绍;可供需求的朋友参考
    2012-11-11
  • upload上传单张图片

    upload上传单张图片

    这篇文章主要介绍了upload上传单张图片的代码,需要的朋友可以参考下。
    2015-07-07
  • 修改 asp.net core 5 程序的默认端口号

    修改 asp.net core 5 程序的默认端口号

    这篇文章主要介绍了修改 asp.net core 5 程序的默认端口号,我们知道可以通过修改 launchSettings.json 文件中的端口号来实现端口切换,下面来看看具体的修改过程吧
    2022-01-01
  • 使用.NET6实现动态API

    使用.NET6实现动态API

    本文详细讲解了使用.NET6实现动态API,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 水晶易表调用C#的WebService,返回数据集合的应用分析

    水晶易表调用C#的WebService,返回数据集合的应用分析

    本篇文章介绍了,水晶易表调用C#的WebService,返回数据集合的应用分析。需要的朋友参考下
    2013-04-04
  • ASP.NET Core 中间件的使用之全局异常处理机制

    ASP.NET Core 中间件的使用之全局异常处理机制

    我们今天这篇文章就来说说代码异常问题怎么快速定位,减少不必要的时间浪费。异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止。下面雄安边将详细介绍,需要的朋友可以参考下
    2021-09-09

最新评论