Asp.Net Core 内置IOC容器的理解
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容器的理解的更多相关文章
- .net core系列之《.net core内置IOC容器ServiceCollection》
一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...
- asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- 第七节:Asp.Net Core内置日志和整合NLog(未完)
一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...
- ASP.NET CORE 内置的IOC解读及使用
在我接触IOC和DI 概念的时候是在2016年有幸倒腾Java的时候第一次接触,当时对这两个概念很是模糊:后来由于各种原因又回到.net 大本营,又再次接触了IOC和DI,也算终于搞清楚了IOC和DI ...
- 简单讲解Asp.Net Core自带IOC容器ServiceCollection
一. 理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二. 接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...
- ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期
IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
随机推荐
- Flutter - You need to use a different version code for your APK or Android App Bundle because you already have one with version code 1.
前两天提交了一个版本Google Play,结果今天收到拒绝的邮件,说App内购有问题. 于是把设置里面的支付宝和微信打赏功能关闭,又打了一个aab. 然后上传到Google Play,结果提示 Yo ...
- 《大型网站系统与Java中间件》读书笔记(上)
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 这本书买了一段时间了,之前在杭州没带过去,现在读完第 ...
- 完整开发流程管理提升与系统需求分析过程 随堂笔记(day 1) 【2019/10/14】
Top12原则: 主要资源,重要功能,依据需求重要度进行资源分配, 项目100功能 1 day -> 100Task -> 10 Dev 20% 80% 开发各阶段流程及规范 需求.架 ...
- Javascript继承的问题
说到Javascript的继承,相信只要是前端开发者都有所了解或应用,因为这是太基础的知识了.但不知各位有没有深入去理解其中的玄机与奥秘.今本人不才,但也想用自己的理解来说一说这其中的玄机和奥秘. 一 ...
- Linux CentOS 7 搭建 Tomcat 8 服务器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- 微信小程序之启动页的重要性
启动页在APP中是个很常见的需求,为什么对于小程序来说也非常重要呢?首先我描述一下我在开发过程中遇到的一些问题以及解决的步骤,到最后为什么要加启动页,看完你就明白了. 小程序的首页需要展示用户关注的小 ...
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- Add the Scheduler Module 添加计划程序模块
Important 重要 Scheduler requires the Event business class to be in your XAF application model. Follow ...
- solo升级以及自动化更新的方法
使用solo过程总涉及到更新问题,所以就在这里把solo更新的方法总结一下.希望能给小伙伴们一些帮助.如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker方式进行部署,那么你可以还可以 ...
- 编译原理之LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...