依赖注入小谈

Posted mirzhai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖注入小谈相关的知识,希望对你有一定的参考价值。

一直以来做.Net 开发也好几年,却不知道依赖注入(也是醉了)。最近在学习.net Core,才开始接触学习依赖注入,自己总结一下。

微软这样定义asp.net core:一个可跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。(重要的是开源的)

ASP.NET Core 是重新设计的 ASP.NET 4.x,更改了体系结构,形成了更精简的模块化框架,其底层设计支持并使用依赖注入,其利用内置的框架服务

将他们注入到启动类的方法中,而且应用程序还能配置注入。.net core  的容器提供最小功能集,但并不是要取代其他容器。

1、概念

依赖注入(Dependency injection,DI)是一种实现对象及其合作的者或依赖项之间松耦合的技术。

(腾飞大神说)当一个类需要另一个类协作来完成工作的时候就产生了依。依赖的设计原则是:依于抽象,而不是具体的实现。

将类用来执行其操作(action)的这些对象以某种方式提供给该类,而不是直接实例化合作者或使用静态引用。

通常,类会通过他们的构造函数声明其依赖关系,允许它们遵循显示依赖原则,也就是构造函数注入

DI思想:它们的耦合更加松散,因为它们没有对它们的合作者直接硬编码的依赖,遵循依赖倒置原则(高层模块不应该依赖底层模块;两者都应该依赖

于抽象),类要求在它们构造时向其提供抽象(通常是interfaces),而不是引用特定的实现。提取接口的依赖关系个提供这些接口的实现作为参数也

是“策略设计模式”。

当系统被设计使用DI,很多类通过它们的构造函数(或属性)请求其依赖关系,当一个类被用来创建这些类及其相关的依赖关系是很有帮助的,这些类

被称为“容器(containers)”或者“依赖注入(DI)容器”或者“控制反转(IOC)容器”

容器本质上是一个工厂,负责提供向它请求的类型实例。统一管理系统中所有的依赖项。

容器负责两件事情:
  • 绑定服务与实例之间的关系
  • 获取实例,并对实例进行管理(创建与销毁)

如果一个给定类型声明它具有依赖关系,并且容器已经被配置为提供依赖类型,那么它将把创建依赖关系作为创建请求实例的一部分。提供这种方式,

可以向类型提供复杂的依赖关系而不需要任何硬编码的类型构造。除了创建对象的依赖关系外,容器也可以管理应用程序中对象的声明周期。

.net core默认支持构造函数注入的简单内置容器(由IServiceProvider接口表示),并且asp.net使某些服务可以通过DI获取。

注入在这里我们需要了解IOC(控制反转)。
 
我们先说一下正转,也就是自己实例化需要的依赖(new一个对象)。
 
但这样的方式不好,这才有了控制反转,即:你不应该自己创建它,而是应该由你的调用者给你
 
于是你通过构造函数让外界把这两个依传给你。把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入

 使用控制反转的目的是为了:在业务变化的时候,尽可能减少的因改动代码而造成的问题。 

 2、.Net Core应用
在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。
  • IServiceCollection 负责注册
  • IServiceProvider 负责提供实例
 通过默认的 ServiceCollection(在Microsoft.Extensions.DependencyInjection命名空间下)有三个方法:
 
  var serviceCollection = new ServiceCollection()
 1、 .AddTransient<ILoginService, EFLoginService>()
 2、 .AddSingleton<ILoginService, EFLoginService>()
 3、 .AddScoped<ILoginService, EFLoginService>();
 
.NET Core DI 为我们提供的实例生命周其包括三种:
  • Transient(瞬时): 对象总是不同的,想每一个控制器和每一个服务提供一个新的实例。
  • Scoped(作用域):  对象在一次请求中是相同的,在在不同的请求中是不同的。
  • Singleton (单例):整个应用程序生命周期以内只创建一个实例 ,对象对每一个对象和每一个请求是相同的。
 
 
较深层次还未理解透彻,待更。。。
 

以上是关于依赖注入小谈的主要内容,如果未能解决你的问题,请参考以下文章

Android片段和依赖注入

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

Eclipse OSGi 包需要另一个包的片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段