asp.net core 系列 3 依赖注入服务
原文:asp.net core 系列 3 依赖注入服务

一. 依赖注入概述

  在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在ASP.NET Core中的实现。

  直接依赖是指:当一个类需要另一个类协作来完成工作的时候就产生了依赖。举例比如:模块 A 调用模块 B 中的函数,而模块 B 又调用模块 C 中的函数,则编译时 A 取决于 B,而 B 又取决于 C。这是有严重的依赖关系,不属于松散耦合。

  依赖反转是指:高层模块不应该依赖低层模块,二者都应该依赖于抽象,是对接口而不是实现编程。当一个类(Class)需要被外部依赖,就需要把它抽象成一个接口(interface),如何把这个接口变成具体可调用的实例,就是由依赖注入来完成。依赖反转是生成松散耦合应用程序的关键一环。当应用依赖反转原则后,A 可以调用 B 实现的抽象上的方法,让 A 可以在运行时调用 B,而 B 又在编译时依赖于 A 控制的接口。 运行时程序执行的流程保持不变,但接口引入意味着可以轻松插入这些接口的不同实现

  假设一个方法从流读取字节,并把它们写入某个缓冲:

//直接依赖 这里的伪代码依赖于两个低层模块,读取器和写入器。
void Copy(){Byte byte1;Reader reader = new Reader();Writer writer = new Writer();while (byte1 = reader.ReadFromStream())writer.WriteTobuffer(byte1);}

//依赖反转 这里的伪代码依赖于两个抽象类,读取器和写入器。
void Copy(IReader reader, IWriter writer){Byte byte1;while (byte1 = reader.ReadFromStream())writer.WriteTobuffer(byte1)}

  上面接口的读取器和写入器的实例谁来提供呢?需要使用依赖注入模式。实现依赖注入需要使用IoC 容器,目前有Unity和MEF 2 二种IoC 容器工具来实现。以及下面讲到ASP.NET Core自带的依赖注入实现。

二. ASP.NET Core依赖注入

  ASP.NET Core 支持依赖关系注入的设计模式,是类及其依赖关系之间实现控制反转 (IoC)的技术。在ASP.NET Core中依赖注入解决的问题包括:

  (1) 使用接口抽象化依赖关系实现。

  (2) 注册服务容器中的依赖关系。ASP.NET Core内置的服务容器 IServiceProvider。 实现在Startup.ConfigureServices 方法中注册服务(服务一般是接口)。

  (3) 将服务注入到使用它的类的构造函数中。

  下面示例中,使用具体类型 MyDependency 注册 IMyDependency 服务, 注册将服务生存期的范围限定为单个请求的生存期。在MyDependency实现类中使用框架内部已注入好的ILogger来帮助打印日志输出。

    // 第一步 使用接口抽象化来实现依赖反转, 定义 IMyDependency 服务public interface IMyDependency{Task WriteMessage(string message);}// IMyDependency 服务的实现类public class MyDependency : IMyDependency{private readonly ILogger<MyDependency> _logger;public MyDependency(ILogger<MyDependency> logger){_logger = logger;}public Task WriteMessage(string message){_logger.LogInformation("MyDependency.WriteMessage called. Message: {MESSAGE}",message);return Task.FromResult(0);}
}

// 第二步在 将IMyDependency服务注册到服务容器中。public void ConfigureServices(IServiceCollection services){//....//每次请求时创建,贯穿整个请求services.AddScoped<IMyDependency, MyDependency>();//....      }

// 第三步 将服务注入到使用它的类的构造函数中,在Index.cshtml.cs类中调用IMyDependency服务的WriteMessage方法public class IndexModel : PageModel{private readonly IMyDependency _myDependency;public IndexModel(IMyDependency myDependency){this._myDependency = myDependency;}public void OnGet(){_myDependency.WriteMessage("IndexModel.OnGetAsync created this message.");}}

  下面是输出WriteMessage方法的日志信息:

  参考文献:

    Microsoft.NET 企业级应用 架构设计

    官方文档:ASP.NET Core 依赖注入

  

posted on 2019-01-22 10:30 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10302392.html

asp.net core 系列 3 依赖注入服务相关推荐

  1. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  2. 拥抱.NET Core系列:依赖注入(2)

    上一篇"拥抱.NET Core系列:依赖注入(1)大体介绍了服务注册.获取和生命周期,这一篇来做一些补充.由于内容跨度大(.NET Core.ASP.NET Core),所以文章并不是非常的 ...

  3. ASP.NET Core 中的依赖注入

    什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要依赖于抽象,不要依赖于具体.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖 ...

  4. ASP.NET Core 2.0 依赖注入

    问题 如何使用 ASP.NET Core 服务容器进行依赖注入? 答案 创建一个服务 public interface IGreetingService { string Greet(string t ...

  5. ASP.NET Core MVC 之依赖注入 Controller

    ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系,在某些情况下,单个控制器地操作可能需要一个服务,在控制器级别上的请求可能没有意义.在这种情况下,也可以将服务作为  Ac ...

  6. ASP.NET Core MVC 之依赖注入 View

    ASP.NET Core 支持在试图中使用依赖注入.这将有助于提供视图专用的服务,比如本地化或者仅用于填充视图元素的数据.应尽量保持控制器和视图之间的关注点分离.视图所显示的大部分数据应该从控制器传入 ...

  7. ASP.NET Core 下的依赖注入(一)

    本文介绍利用 Microsoft.Extensions.Configuration.Binder.dll 来实现超级简单的注入. 1. appsettings.json 中定义配置 假设我们有如下配置 ...

  8. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  9. 拥抱.NET Core系列:依赖注入(1)

    前言 DIP.IoC.DI 说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系. 依赖倒置原则(DIP):软件设计原则,要依赖于抽象,不要依赖具体实现. 控 ...

  10. winform防止sqlserver注入_ASP.NET Core 中的 依赖注入介绍

    ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...

最新文章

  1. C/C++ 编程规范(02)— 标识符命名
  2. 使用7z命名行备份VS项目
  3. hdu 2074 叠框
  4. Head First JSP---随笔九(Web应用安全)
  5. 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll
  6. sasl java_javaSASL_SSL帐号密码方式访问kafka
  7. java unsafe park_Java中Unsafe类详解
  8. 10年+SQL性能优化专家谈SQL等价改写核心思想
  9. 一个C++工程CPU占用100%问题的排查
  10. Python中带else子句的for循环执行过程
  11. 5 video关掉字幕选项_Photoshop 2020中英文字幕批量生成的制作方法
  12. ASO优化技巧:利用好App下载周期变化,aso优化技巧介绍
  13. 如何把JPG图片转换成Word文字?
  14. 以全局产业观领航智慧城市建设
  15. win7 关闭计算机休眠,Win7关闭休眠的方法
  16. Android 的媒体路由功能应用与框架解析 MediaRouter
  17. 交换机链路聚合(静态,动态)
  18. Macbook Pro上装Linux的牢骚
  19. 11个提高开关电源效率的小技巧
  20. 成都华西健康管理(体检)中心体检套餐

热门文章

  1. 基于SSM的教学质量系统
  2. 数据结构排序算法思路总结
  3. Linux Centos firewall 防火墙 开启 80 端口配置案例
  4. Netty 网络框架概述 与 快速入门
  5. Linux 查找进程与结束进程
  6. Nginx 解决 Tomcat 集群下的 Session共享
  7. Mysql 数据库/表 备份 与 还原
  8. Windows 安装 Git,sh.exe 调用 Windows 上的 .sh 格式文件
  9. jq向php文件传json,jQuery向后台传入json格式数据的方法
  10. kafka生产者集群和分区,消费者轮询接收