Asp.Net Core 内置IOC容器的理解

01.使用IOC容器的好处

  • 对接口和实现类由原来的零散式管理,到现在的集中式管理。
  • 对类和接口之间的关系,有多种注入模式(构造函数注入、属性注入等)。
  • 对实现类的声明周期进行了统一管理(创建、释放、和监控)。
  • 对类的依赖有编译时到运行时。

02.实际使用

1.创建控制台项目并添加Nuget包引用

Nuget包:Microsoft.Extensions.DependencyInjection

2.简单使用

class Program
{
static void Main(string[] args)
{ // 正常使用
Bird bird = new Bird(); //IFly bird=new Bird();
bird.Fly(); //IOC使用
ServiceCollection serviceCollection = new ServiceCollection(); //创建IOC容器
serviceCollection.AddTransient<IFly, Bird>(); //将服务注入容器
var provider = serviceCollection.BuildServiceProvider(); //创建Provider
var fly = provider.GetService<IFly>(); //获取注入的类型
fly.Fly(); //调用
}
} interface IFly
{
void Fly();
} class Bird : IFly
{
public void Fly()
{
Console.WriteLine("鸟飞起来了........");
}
}

3.日志注册

  • NetGut包:Microsoft.Extensions.Logging.Console
class Program
{
static void Main(string[] args)
{
ServiceCollection serviceCollection = new ServiceCollection();
//注册日志服务
serviceCollection.AddLogging(configure =>
configure.AddConsole()
);
serviceCollection.AddTransient<IFly, Bird>();
var provider = serviceCollection.BuildServiceProvider();
provider.GetService<ILoggerFactory>();
var fly = provider.GetService<IFly>();
fly.Fly(); }
} interface IFly
{
void Fly();
} class Bird : IFly
{
private readonly ILogger<Bird> _iLogger;
public Bird(ILoggerFactory logger)
{
_iLogger = logger.CreateLogger<Bird>();
}
public void Fly()
{
_iLogger.Log(LogLevel.Information, "日志消息.....");
Console.WriteLine("鸟飞起来了........");
}
}

4.生命周期

  • AddTransient 每次请求都会被创建
  • AddSingleton 单例模式
  • AddScoped 作用域(范围)内是单例模式

AddScoped案例代码

class Program
{
static void Main(string[] args)
{
ServiceCollection serviceCollection = new ServiceCollection();
////每次请求都创建
//serviceCollection.AddTransient<IFly, Bird>();
////单例模式,永远都是一个
//serviceCollection.AddSingleton<IFly, Bird>();
//在某个作用域下是单例
serviceCollection.AddScoped<IFly, Bird>(); var provider = serviceCollection.BuildServiceProvider();
//创建两个scope
var scope1 = provider.CreateScope();
var scope2 = provider.CreateScope();
//第一个作用域
scope1.ServiceProvider.GetService<IFly>();
//第二个作用域
scope2.ServiceProvider.GetService<IFly>();
//第三个作用域 注意:这里是获取了两次
var fly = provider.GetService<IFly>();//第一次
fly = provider.GetService<IFly>();//第二次
fly.Fly();
}
} interface IFly
{
void Fly();
} class Bird : IFly
{ public Bird()
{
Console.WriteLine("初始化构造函数......");
}
public void Fly()
{
Console.WriteLine("鸟飞起来了........");
}
}

运行结果:调用了三次构造函数....

Asp.Net Core 内置IOC容器的理解的更多相关文章

  1. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

  2. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  3. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  4. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  5. 第七节:Asp.Net Core内置日志和整合NLog(未完)

    一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...

  6. ASP.NET CORE 内置的IOC解读及使用

    在我接触IOC和DI 概念的时候是在2016年有幸倒腾Java的时候第一次接触,当时对这两个概念很是模糊:后来由于各种原因又回到.net 大本营,又再次接触了IOC和DI,也算终于搞清楚了IOC和DI ...

  7. 简单讲解Asp.Net Core自带IOC容器ServiceCollection

    一.  理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二.  接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...

  8. ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期

    IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...

  9. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

随机推荐

  1. 一个我经常用到的采集网页数据抓取网页获取数据的PHP函数类

    class get_c_str { var $str; var $start_str; var $end_str; var $start_pos; var $end_pos; var $c_str_l ...

  2. vscode搭建C/C++环境

    windows安装Mingw-w64 Mingw-w64安装 准备工作 创建文件夹Vc_c++ 在Vc_c++文件夹下创建下面两个文件夹 在g++下创建demo.cpp 在gcc下创建demo.c 打 ...

  3. grid行高亮显示

    grid var grid = new Ext.RSEGrid({ //数据显示面板 id: 'O005_grid', title: '图纸目录', loadMask: true, autoScrol ...

  4. SAP 基础知识

    SAP R/3系统的应用层由应用服务器及消息服务器(Message Server)组成. 应用服务器组件如下: 工作进程(Work Process) 调度机(Dispatcher) 网关服务器(Gat ...

  5. Pycharm导入Django项目

    Pycharm导入Django项目 添加项目:file-->open,找到项目所在的位置打开项目 添加django后台项目路径 file-->settings-->Languages ...

  6. VMware_Player_nat网络的端口映射_手工设置

    VMware_Player_nat网络的端口映射_手工设置 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-12-21. vmware nat的配置文件在 C:\ProgramDat ...

  7. HttpRunner学习3--extract提取数据和引用

    前言 在HttpRunner中,我们要想从当前 HTTP 请求的响应结果中提取参数,可以通过 extract 关键字来实现. 本人环境:HttpRunner V1.5.8 测试场景 在这里,我将以一个 ...

  8. 移动端H5页面开发,碰到一个字体变大的BUG

    移动端H5页面开发,碰到一个字体变大的BUG webkit内核下,对不定高宽的元素可能会放大其字体.那么,就可以设置一个max-width:或者使用-webkit-text-size-adjust: ...

  9. C#实现地图坐标系的转换(WGS-84、GCJ-02、BD-09)

     WGS-84坐标系:全球定位系统使用,GPS.北斗等 GCJ-02坐标系:中国地区使用,由WGS-84偏移而来 BD-09坐标系:百度专用,由GCJ-02偏移而来 (PS:源于项目需求,本来是想读图 ...

  10. spring的事物管理配置

    基于注解的事务管理器配置(AOP) 首先要引入AOP和TX的名称控件 <!-- 使用annotation定义事务 --> <tx:annotation-driven transact ...