首页 > 其他分享 >.net core di ioc

.net core di ioc

时间:2024-02-22 12:00:41浏览次数:23  
标签:core 依赖 对象 作用域 WriteLine IServiceProvider net ioc

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

依赖倒置原则的含义如下

  1. 上层模块不依赖下层模块。二者都依赖抽象
  2. 抽象不依赖细节
  3. 细节依赖抽象

依赖注入原则有别于传统的通过关键字new直接依赖下层模块的形式,以第三方容器注入的形式进行依赖项的管理。依赖注入是实现控制反转的一种手段,而用来实现依赖注入的技术框架又被成为IOC框架

控制反转(Inversion of Control,IOC),由于对象之间存在紧密的相互依赖关系,每个对象都需要管理依赖关系的引用,应用程序代码变得高度耦合且难以拆分。而依赖注入则改变了对象原本的依赖形式。可以实现对依赖关系的控制反转

.net core 提供原生的IOC框架(命名空间Microsoft.Extension.DependencyInjection),该框架具有轻量和易用性的特点

依赖注入提倡使用面向接口编程

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello DI IOC!");
            var provider = new ServiceCollection()
                .AddSingleton<MessagePrinter>()
                .AddSingleton<IWriter, ConsoleWriter>()
                .BuildServiceProvider(validateScopes: false);
            var consoleWriter = provider.GetRequiredService<MessagePrinter>();
            consoleWriter.WriteLine();
        }
    }
    public interface IWriter
    {
        void WriteLine(string msg);
    }
    public class ConsoleWriter : IWriter
    {
        public void WriteLine(string msg)
        {
            Console.Out.WriteLine(msg);
        }
    }
    public class MessagePrinter
    {
        private IWriter _writer;
        public MessagePrinter(IWriter writer)
        {
            _writer = writer;
        }

        public void WriteLine()
        {
            _writer.WriteLine("Hello World");
        }
    }
}
View Code

IServiceProvider是依赖注入的核心抽象接口

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

生命周期

  1. 单例(Singleton),只会创建一次对象,后续调用复用对象
  2. 作用域(Scoped),作用域下只生成一个实例,有人将使用的Scoped称为“请求单例”,表示在每个http请求期间创建一次
  3. 瞬时(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<T>扩展方法来获取实例

应该从IServiceScope对象中解析,而不是从IServiceProvider对象中解析,在asp.net core请求中框架会自动创建ServiceProviderServiceExtensions.CreateScope作用域容器,不是asp.net core 可以自行创建一个作用域

 

 

标签:core,依赖,对象,作用域,WriteLine,IServiceProvider,net,ioc
From: https://www.cnblogs.com/xiaozhilong/p/18027018

相关文章

  • 改造Aforge.Video在.NetCore中使用
    Aforge.Video是可以方便获取摄像头等视频输入设备图像的轻量级组件,但是该组件的最新版本2.2.5大约是在2013年发布的,仅支持.NetFramework,在基于.Net6的Winform中无法使用。Aforge.Video组件存在开源项目AForge.NET中,该项目有1kStars(2024.02)。本文的改造思想是将项目中使......
  • C#以及.Net问题合集
    静态成员(静态方法、静态属性等)不属于类的任何个体对象,它们属于类本身。因此,不能通过实例化的对象来调用静态方法。而应该直接通过类名来调用静态成员,如下:```csharpCalculator.Report();```反过来,非静态方法(如`Add`和`Sub`方法)则需要通过实例化的对象来调用。如下:```csharpCal......
  • .net core 读取appsetting.json 封装
    /*需要引入的包Microsoft.Extensions.Configuration-提供配置的核心功能。Microsoft.Extensions.Configuration.Json-支持从JSON文件加载配置。Microsoft.Extensions.Configuration.FileExtensions-支持文件相关的配置,如设置基路径。Microsoft.Extensions.Configura......
  • Log4Net使用
    1、自定义配置<?xmlversion="1.0"encoding="utf-8"?><configuration> <log4net> <appendername="RollingLogFileAppender"type="log4net.Appender.RollingFileAppender"> <datePatternvalue=&quo......
  • 记一次 .NET某列控连锁系统 崩溃分析
    一:背景1.讲故事过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答案,让我看看有没有什么线索,看样子这是一个牛皮藓的问题,既然对方有了dump,那就分析起来......
  • 如何让.NET Core支持GB2312和GBK
    在.NETCore中,默认是不支持GB2312和GBK编码的。若果强制使用Encoding.GetEncoding(“GB2312”)的时候会抛出异常。所以在.NETCore中如果我们要使用GB2312和GBK编码,需要给项目引入一个Nuget包:包安装可以使用以下方法来添加System.Text.Encoding.CodePages:VisualStudio......
  • home-assistant core 源码粗读--对设备历史的处理(三)
    我们已经知道User等保存是直接以json的形式直接保存到文件中。先说结论:设备的检测历史默认保存在sqlite中Thedefault,andrecommended,databaseengineis SQLite whichdoesnotrequireanyconfiguration.ThedatabaseisstoredinyourHomeAssistantconfigurati......
  • home-assistant core 源码粗读--如何管理多用户-用户存储(二)
    程序中搜索User, 很容易命中homeassistant/auth/models.py程序中大量使用了attr.s进行模型的声明。上篇说过dataclass,以及BaseModel,区别见: https://www.modb.pro/db/412679文件中定义了5个模型,这里只需要猜测他们的意思即可,这里重点分析User。程序中搜索User, 很容易命......
  • home-assistant core 源码粗读--程序入口篇(一)
    core源码地址:https://github.com/home-assistant/core/tree/mastercore与其他container等版本区别见: https://www.home-assistant.io/installation/入口:homeassisstant/__main__.py   难点: faulthandler【错误记录的包,C语言编写】,  parser.add_mutually_exclusi......
  • Rust 编译报 spurious network error (1 tries remaining): [7] Couldn't connect to
    现象:当执行 cargobuild时报类似错误:warning:spuriousnetworkerror(3triesremaining):[7]Couldn'tconnecttoserver(Failedtoconnectto127.0.0.1port8899after2040ms:Couldn'tconnecttoserver);class=Net(12)warning:spuriousnetworkerror......