• 依赖注入小谈


    一直以来做.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.DotNet 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 (单例):整个应用程序生命周期以内只创建一个实例 ,对象对每一个对象和每一个请求是相同的。

    3.常用IOC框架

    1、ninject

    2、autofac

    3、spring.Net

    4、unity

     
    较深层次还未理解透彻,待更。。。
     
  • 相关阅读:
    FPGA基础学习(2) -- FIFO IP核(Quartus)
    FPGA中如何实现除法?
    GPIO初始化之PB3/PB4/PA13/PA14/PA15引脚的复用--寄存器版本
    图像处理实际应用启发
    霍夫变换(hough transform)
    傅里叶变换讲解
    模拟电路学习入门的建议(综合整理)
    低噪声APD偏置电路
    如何安装altium designer 10
    后仿真
  • 原文地址:https://www.cnblogs.com/MirZhai/p/9171916.html
Copyright © 2020-2023  润新知