.net core 注入机制与Autofac
本来是要先出注入机制再出 管道 的,哈哈哈……就是不按计划来……
这里扯扯题外话:为什么要注入(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 提供的就是构造函数的注入方式。但注入还可以是属性的注入。属性注入就像是选择性依赖关系,而构造函数的注入就像是强制性依赖关系。(属性注入跟构造函数可以下次单独进行讨论)
.net core 注入机制与Autofac的更多相关文章
- # ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...
- NET Core依赖注入解读&使用Autofac替代实现
NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...
- ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】
ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...
- Hangfire&Autofac与ASP.NET CORE注入失败
Hangfire.Autofac与ASP.NET CORE注入失败 项目里面使用了Hangfire,因为之前没用过吧,遇到了个问题,就是使用了ico容器后,再用Hangfire总是注入不上对象,总是后 ...
- .Net Core 学习之路-AutoFac的使用
本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的话,建议先去搜索一下相关的资料 这篇文章将简单介绍一下AutoFac的基本使用以及在asp .net core中的应用 Autofac介绍 组 ...
- ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported.
ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported ...
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]
原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...
- 多封装,少开放。强烈建议C++标准添加class之间的注入机制
近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问--当然使用了普通非virtual的形式也就是意味着不建议重载. 故此: ...
- .net core 注入中的三种模式:Singleton、Scoped 和 Transient
从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...
随机推荐
- use ECharts with Angular 2 and TypeScript
https://stackoverflow.com/questions/38158318/is-it-possible-to-use-echarts-baidu-with-angular-2-and- ...
- 基于Python的数据分析(3):文件和时间
在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...
- 学习了解 Exchanger - 实现生产者消费者模型
例子很简单 Exchanger可以理解为消息队列或者说是一个通信管道,从一边拿到消息,另外一边进行消费. 不过这个是同步实现的,消费者在exchange之前,生产者一直处于等待状态,而不是一直生产. ...
- 微信小程序之获取用户位置权限(拒绝后提醒)
微信小程序获取用户当前位置有三个方式: 1. wx.getLocation(多与wx.openLocation一起用) 获取当前的精度.纬度.速度.不需要授权.当type设置为gcj02 返回可用于w ...
- QT中对内存的管理
在QT中,一切继承自QT自有类的类,如果存在parent指针,那么当parent指针delete时,该类中的指针(它们都属于parent指针对应的child指针)也会被delete.综上,如果我们的窗 ...
- Python库
--Python库之Pandas库-------- 自主选择学习了Python中的Pandas库,以下是本人对Pandas库的认识: Pandas库是Python最受欢迎的库之一,主要用于数据的操作. ...
- Linux Ubuntu 16.04 初次安装使用总结zzz
装了两天的ubuntu系统终于算是勉强能用了,来来回回装了有三四次,期间出了各种各样的毛病.但是还是被我的Google大法给治好了.为了装这个系统,算是耗了两天的时间,啥事情都没干,干耗在这上面了.所 ...
- CDN及CDN加速原理
本想自己写这个主题的文章,但网上已经有人写了一篇非常好的文章,觉得难以望其项背.就没有必要再写,直接转载如下: 在不同地域的用户访问网站的响应速度存在差异,为了提高用户访问的响应速度.优化现有Inte ...
- SpringMVC中Controller的方法返回值
1. 返回ModelAndView对象 controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. 实例 @RequestMapping(" ...
- ngnix 是什么
Nginx系列(一)--nginx是什么? 发表于2015/7/1 7:57:58 14347人阅读 分类: Nginx Java 一.介绍 Nginx是一个高性能的HTTP和反向代理服务器,也是一 ...