翼度科技»论坛 编程开发 .net 查看内容

.net core di ioc

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
(Dependency Injection,DI)依赖注入,又称依赖关系注入,是一种软件设计模式,也是依赖倒置原则的一种体现。
依赖倒置原则的含义如下

  • 上层模块不依赖下层模块。二者都依赖抽象
  • 抽象不依赖细节
  • 细节依赖抽象
依赖注入原则有别于传统的通过关键字new直接依赖下层模块的形式,以第三方容器注入的形式进行依赖项的管理。依赖注入是实现控制反转的一种手段,而用来实现依赖注入的技术框架又被成为IOC框架
控制反转(Inversion of Control,IOC),由于对象之间存在紧密的相互依赖关系,每个对象都需要管理依赖关系的引用,应用程序代码变得高度耦合且难以拆分。而依赖注入则改变了对象原本的依赖形式。可以实现对依赖关系的控制反转
.net core 提供原生的IOC框架(命名空间Microsoft.Extension.DependencyInjection),该框架具有轻量和易用性的特点
依赖注入提倡使用面向接口编程
  1. using Microsoft.Extensions.DependencyInjection;
  2. using System;
  3. namespace ConsoleApp1
  4. {
  5.     internal class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             Console.WriteLine("Hello DI IOC!");
  10.             var provider = new ServiceCollection()
  11.                 .AddSingleton<MessagePrinter>()
  12.                 .AddSingleton<IWriter, ConsoleWriter>()
  13.                 .BuildServiceProvider(validateScopes: false);
  14.             var consoleWriter = provider.GetRequiredService<MessagePrinter>();
  15.             consoleWriter.WriteLine();
  16.         }
  17.     }
  18.     public interface IWriter
  19.     {
  20.         void WriteLine(string msg);
  21.     }
  22.     public class ConsoleWriter : IWriter
  23.     {
  24.         public void WriteLine(string msg)
  25.         {
  26.             Console.Out.WriteLine(msg);
  27.         }
  28.     }
  29.     public class MessagePrinter
  30.     {
  31.         private IWriter _writer;
  32.         public MessagePrinter(IWriter writer)
  33.         {
  34.             _writer = writer;
  35.         }
  36.         public void WriteLine()
  37.         {
  38.             _writer.WriteLine("Hello World");
  39.         }
  40.     }
  41. }
复制代码
View CodeIServiceProvider是依赖注入的核心抽象接口


 对于GetRequiredService扩展方法来说,如果服务不可用,就会抛出异常;GetService扩展方法的返回类型是空的,所以是有返回空的可能性的,需要做非空检查
生命周期

  • 单例(Singleton),只会创建一次对象,后续调用复用对象
  • 作用域(Scoped),作用域下只生成一个实例,有人将使用的Scoped称为“请求单例”,表示在每个http请求期间创建一次
  • 瞬时(Transient) ,每次调用都是创建新的对象

 IServiceProvider对象提供了CreateSocpe扩展方法 使用CreateSocpe扩展方法会创建一个相应的服务范围,这个服务范围代表子容器,这个子容器获取相应的IServiceProvider对象
IServiceProvider有两种定义:一种是根容器(Root Scope)中的IServiceProvider对象,是位于应用程序顶端的容器,一般被称为ApplicationServices;另一种是通过IServiceScopeFactory服务创建的带有服务范围的IServiceProvider对象,而对于IServiceScope对象来说,拥有的是一个“范围”性的IServiceProvider对象,只可以拥有一个根容器
 

 

 

 
ASP.NET Core的作用域,在asp.net core中,每个请求都会创建一个全新的Scope(作用域)服务,在这个请求过程中创建的服务实例都会保存在当前的IServiceProvider对象上
ServiceDescriptor对象用于注册指定的服务时,对服务注册项进行描述,
作用域验证,例如,应用程序有一个Context对象,开发人员通常会将其注册为Socped生命周期
控制台实例创建ServiceCollection对象,调用AddSocped扩展方法注册。调用ISerivceprocider对象之后调用GetRequiredService扩展方法来获取实例
应该从IServiceScope对象中解析,而不是从IServiceProvider对象中解析,在asp.net core请求中框架会自动创建ServiceProviderServiceExtensions.CreateScope作用域容器,不是asp.net core 可以自行创建一个作用域

 

 

来源:https://www.cnblogs.com/xiaozhilong/p/18027018
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具