.net core 注入机制

简介: 本来是要先出注入机制再出 管道 的,哈哈哈……就是不按计划来…… 这里扯扯题外话:为什么要注入(DI,dependency-injection),而不用 new 对象? 可能我们都很清楚,new 对象所造成的影响就是耦合度太高,DI 就是用来解耦的。

本来是要先出注入机制再出 管道 的,哈哈哈……就是不按计划来……

这里扯扯题外话:为什么要注入(DI,dependency-injection),而不用 new 对象?

可能我们都很清楚,new 对象所造成的影响就是耦合度太高,DI 就是用来解耦的。或者还可以说,DI 可以统一进行管理对象。

此话怎讲呢?

这里还要扩展一下,讲一下接口(Interface)跟类(Class):

接口的话通常都像 IDisposable、IEnumerable 或者 ICollection 这些一样以 " I " 开头命名的;而类就是继承并实现这些接口的(当然,类不一定要继承),比如 List 或者 Map。他们两个都有可能是 IEnumerable 的实现,因为他们都是多继承的实现类。

所以说,通常我们的类都是依赖于其他的。比如说我们有个 Database 的类(当然日志也行是吧),这个类主要是连接数据库的。然后呢,这个类里面,可能要做一下记录,比如数据库是否连接失败呀,那么就要在这个类里面实例化另外一个 Logger 的类(平时的业务功能代码实现是不是都像这样,哈哈哈)。那么在 Database 类里面实例化了 Logger 类,它们之间就存在了依赖关系(Database 依赖 Logger)。

 public class Database
    {
        public void DoSomething()
        {
            var logger = new Logger();
        }
    }

这代码没毛病,但是如果突然有个需求说,我们的 Logger 不记录在本地,我要通过 TCP/IP 记录到另外一台服务器上。哈,我们是不是要改代码了……

如果我们不希望改动 Logger 里面的代码,那么我们就创建多一个 TcpLogger ,那么是不是要在项目中将所有的或者需要使用到 TcpLogger 的 Logger 类进行替换。

    public class Database
    {
        public void DoSomething()
        {
            //var logger = new Logger();
            //替换成
            var logger = new TcpLogger();
        }
    }

这方法有点蠢吧,第一,没啥意思;第二,很容易出现错误,改动的地方越多,就越容易出错;第三,有点傻,重复去做这些没啥意思的事情,如果下次再换一种日志方式,岂不是又要改一遍?!

理解设计模式的人,很容易想到工厂模式了吧,最常用的。(但,在讲注入,扯到设计模式,是不是跑题啦……)

设计模式大概怎么搞?

 ICanLog logger = new Logger();

熟悉啵,只要继承 ICanLog 并且实现它,我们要什么就 new 什么。但这样同样是 new 实例的方式,也没有做到,我要是换一种方式记录日志,还是要改代码呀。我就是忒不想改代码的。那就试试换一种:

            ICanLog logger = LoggerFactory.Create();
            //或者
            ICanLog logger = TypeFactory.Create<ICanLog>();

这也超级熟悉的是不是。嗯,好像是要换什么日志方式,就去改类型工厂。改的少的,但是不是有可以不改代码的方式?

肯定是有的!我们可以通过映射(mapping)进代码里面。但如果在代码里面进行映射,还是要进行编译。那如果把映射关系放到 XML 文件里面,就不用重新编译啦。在开发中,是体会不了这种爽的。举个栗子:

在生产环境中,如果某些原因,其中一个正在 Log 的功能运转不了了,但是可以使用另外一种方式进行 Log,我们是不是更新一下 XML 配置文件,替换一下就可以。(千万别把改配置跟改代码混为一谈,完全不同!本质区别!)

OK,这里通过 XML 配置文件进行映射的功能,换个概念 -- IoC(Inversion of Control,控制反转),什么意思?

since you invert control over who decides what exact class to instantiate.

 简而言之,你控制你所要使用的实例,就是通过(配置)控制转化你所要使用的类实例。

上面所说的其实跳过了很多很多,就是怎么实现这种映射,代码中有怎么决定使用哪一个实例呢?还是用日志举例:就是你本来就已经写好了两种日志的模式,你的配置只是确定你要使用哪一种日志模式而已,我们就可以当成这种是一种服务的定位器(就是确定我要使用的服务)。

现在的话,我们的代码已经不再是 Logger 类了,而且依赖于这个配置。

往回看一下日志工厂或类型工厂的创建实例的过程,那么注入的下一步就是获得注入的实例,看代码:

        public Database(ICanLog logger) {

        }

见鬼啦,.net core 里见得多了吧。当然,我们现在仍然是不知道到底怎么注入的,注入的过程是怎么样的,但我们已经知道为什么要用注入了。

终于要进入主题啦 -- .net core 注入机制(.net core 提供了一个内置的服务容器 IServiceProvider,服务已在应用的 Startup.ConfigureServices 方法中注册):引入了 Conforming Container  机制,包含了请求生命周期作用域, 服务注册等等的统一概念。

 

看图,看完就讲完了,哈哈哈……其实图中没有将服务的生命周期画出来,可以去《.net core 注入中的三种模式:Singleton、Scoped 和 Transient》看服务容器 IServiceProvider 负责管理服务的过程。这里补重复码字。

上图中,我们看到一个容器,是 .net core 提供的一个容器,用来管理所注入的服务的。那么既然有了一个容器,我们为什么要在这篇里面讲 Autofac?Autofac 是什么?

Autofac 是一款 Ioc 容器!

在 .net core 使用 Autofac ,我将它理解为容器的扩展与补充。(咦,可以来一篇 Autofac 的个人秀哟)

 1、.net core 没有能处理每个请求特定的作用域;

 2、.net core 相比 Autofac,后者维护起来更方便(maintainability)、可读性更强(readability),没那么容易混淆;

 3、后续继续总结!

 .net core 与 Autofac 除了这些之外,它们之间只是选择而已!

PS:.net core 提供的就是构造函数的注入方式。但注入还可以是属性的注入。属性注入就像是选择性依赖关系,而构造函数的注入就像是强制性依赖关系。(属性注入跟构造函数可以下次单独进行讨论)

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
5天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
5天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
5天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
5天前
|
人工智能 前端开发 开发工具
【专栏】.NET 技术:为开发注入新动力
【4月更文挑战第29天】本文探讨了.NET技术如何为开发注入新动力,分为核心优势、创新应用及挑战与机遇三部分。.NET提供统一多语言开发平台、强大的Visual Studio工具、跨平台能力、丰富的类库和活跃社区支持。在现代开发中,它应用于企业级、Web、移动、云服务和游戏开发。然而,面临性能优化、容器化、AI集成等挑战,.NET需持续创新。开发者应深入学习,抓住技术趋势,共同推动.NET技术进步。
|
5天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0
|
5天前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
28 4
|
5天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
5天前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
100 0
|
5天前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
41 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!