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

这里扯扯题外话:为什么要注入(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的更多相关文章

  1. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  2. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

  3. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  4. Hangfire&Autofac与ASP.NET CORE注入失败

    Hangfire.Autofac与ASP.NET CORE注入失败 项目里面使用了Hangfire,因为之前没用过吧,遇到了个问题,就是使用了ico容器后,再用Hangfire总是注入不上对象,总是后 ...

  5. .Net Core 学习之路-AutoFac的使用

    本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的话,建议先去搜索一下相关的资料 这篇文章将简单介绍一下AutoFac的基本使用以及在asp .net core中的应用 Autofac介绍 组 ...

  6. 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 ...

  7. 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]

    原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...

  8. 多封装,少开放。强烈建议C++标准添加class之间的注入机制

    近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问--当然使用了普通非virtual的形式也就是意味着不建议重载. 故此: ...

  9. .net core 注入中的三种模式:Singleton、Scoped 和 Transient

    从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...

随机推荐

  1. html5 file upload and form data by ajax

    html5 file upload and form data by ajax 最近接了一个小活,在短时间内实现一个活动报名页面,其中遇到了文件上传. 我预期的效果是一次ajax post请求,然后在 ...

  2. id为194024的进程当前未运行

    .NET MVC 编译运行时 提示  >> id为194024的进程当前未运行 << 清理解决方案,重新运行

  3. Jmeter(二十六)_数据驱动测试

    花了一点时间做了一个通用的执行引擎,好处就是我不用再关注测试脚本的内容,而是用测试用例的数据去驱动我们执行的方向.(这个只适合单个接口的测试,具体运用到接口自动化时,还是要靠手动去编写脚本!) 首先我 ...

  4. Android之淘宝商品列表长按遮罩效果

    先来看看淘宝.唯品会长按商品的效果,以及简单Demo的效果:        首先分析一下场景: 长按条目时,弹出遮罩的效果遮挡在原来的条目布局上: 页面滑动或点击其他的条目,上一个正在遮罩的条目遮罩消 ...

  5. Python_shelve模块操作二进制文件

    import shelve #导入shelve模块 fp=shelve.open('shelve_test.dat') #创建或打开二进制文件 zhangsan={'age':38,'sex':'Ma ...

  6. 【淘宝客】根据淘客联盟精选清单(淘宝天猫内部优惠券)随机显示淘宝天猫优惠券dome

    也许大家在生活中经常淘宝看到[淘宝天猫内部优惠券]的网站,或者在微博中经常有博主发券,让大家生活中购物便宜许多,作为一个站长,我们也希望自己的网站也能有这样的一个功能,现在就分享给大家,还是免后台哦. ...

  7. nohup在linux中的挂起

    笔者也是一个linux新手,最近在学习linux相关的东西,本人是一个node爱好者,想在linux上写一个linux服务,我的环境是centeros7,用putty链接远端的服务器,要想让服务在服务 ...

  8. SSM-SpringMVC-20:SpringMVC中处理器方法之返回值void篇

      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 处理器的方法我们之前做过,返回值为String的,返回值为ModelAndView的,我们这个讲的这个返回 ...

  9. .NET Orm 性能测试

    .NET Orm 性能测试 简介 OrmBenchmark 这个项目主要是为了测试主要的Orm对于 SqlServer 数据库的查询并将数据转换成所需 POCO 对象的耗时情况(好吧,实际上不完全or ...

  10. LoadRunner Mysql性能优化

    原文:https://blog.csdn.net/u011910905/article/details/49863787 一.查询与索引优化分析 1.show命令: show engines; 显示存 ...