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. More than one file was found with OS independent path 'lib/armeabi-v7a/libgnustl_shared.so'

    More than one file was found with OS independent path 'xxx/xxx' 这个错误是在路径中出现了重复依赖. 解决办法是配置打包选项, 在 and ...

  2. JUC-6-Callable接口

    创建线程的方式                  不能有返回值,且不能声明抛出异常                                                           ...

  3. mac下使用minicom几个注意事项

    一 安装: 安装是比较简单的,直接: brew install minicom 二 查找串口驱动 这里不得不吐槽苹果公司,搞一个串口,从来就不像ubuntu中那样很简洁的名字,这里的名字一般是一长串, ...

  4. Android Studio学习-连接真机测试教学

    Android Studio 原文链接 https://blog.csdn.net/weixin_44304387/article/details/99213012 真机测试会比AVD(Android ...

  5. CSS 利用 `padding-bottom` 实现固定比例的容器

    复用 padding-bottom 可实现一块区域在窗口尺寸变化使始终保持自适应.对于响应式布局中的图片或视频来说比较有用. <div style="width: 100%; posi ...

  6. NET Framework项目移植到NET Core上踩的坑(1)

    本文章向大家介绍NET Framework项目移植到NET Core上遇到的一系列坑,主要包括NET Framework项目移植到NET Core上遇到的一系列坑使用实例.应用技巧.基本知识点总结和需 ...

  7. C#封装继承

    面向对象开发有三大特性(特点 / 特征) : 封装, 继承, 多态.我们今天主要讨论封装和继承,多态会在下篇中讨论. 一.封装: 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法 ...

  8. WPF 3D球及进阶玩法

    在WPF中3D球的构建算法请参考: https://www.cnblogs.com/lonelyxmas/p/9844951.html 好玩以及值得借鉴的Demo:   (CSDN下载需要积分,避免你 ...

  9. java 超详细面经整理(持续更新)2019.12.19

    目录 Java SE 请你解释HashMap中为什么重写equals还要重写hashcode? 请你介绍一下map的分类和常见的情况 请你讲讲Java里面的final关键字是怎么用的? 请你谈谈关于S ...

  10. WestWild: 1.1: Vulnhub Walkthorugh

    启动界面 主机层面扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.131 Starting Nmap 7.70 ( https://nmap.org ) at 2019- ...