1. 控制反转(IoC)

  控制反转(Inversion of Control,IoC),是面向对象编程中的一种设计原则,用来降低代码之间的耦合度。

1.1 依赖倒置

  依赖原则:

  (1)高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象。

  (2)抽象不应该依赖于具体,具体应该依赖于抽象。

1.2 依赖注入

  依赖注入:把依赖部分(代码不可控或者经常变动的耦合的部分)变成一个抽象的成员(类、抽象类或接口),然后根据具体所需要的实例去灵活的注入依赖,来达到控制反转的效果,从而实现代码解耦。

  依赖注入是控制反转的一种具体实现方式。

  C#常用的依赖注入方式:

  (1)通过构造器进行依赖注入

  (2)通过属性的访问器进行依赖注入

  (3)通过接口实现依赖注入

  (4)通过反射,特性也可以实现依赖注入

2. ASP.NET Core自带实现依赖注入

  依赖注入安装包:

Install-Package Microsoft.Extensions.DependencyInjection

  ASP.NET Core 提供了一个内置的服务容器 IServiceProvider,在 Startup.ConfigureServices 方法中配置依赖注入。

  ASP.NET Core 注册服务生存期:

  (1)AddTransient:暂时生存期,每次从服务容器进行请求时创建。

  (2)AddScoped:作用域生存期,每个客户端请求(连接)一次创建。

  (3)AddSingleton:单一实例生存期服务,在第一次请求时创建,每个后续请求都使用相同的实例。

  示例:

public interface ILogRepository
{
int Insert(Log log);
}

ILogRepository

public class LogRepository : ILogRepository
{
public int Insert(Log log)
{
using (var context = new PortalContext())
{
context.Logs.Add(new Log
{
UserName = log.UserName,
Content = log.Content,
CreateTime = DateTime.Now
}); return context.SaveChanges();
}
}
}

LogRepository

  Startup.cs

using Microsoft.Extensions.DependencyInjection;

public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ILogRepository, LogRepository>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

  LogController.cs

[Route("api/[controller]")]
[ApiController]
public class LogController : ControllerBase
{
private readonly ILogRepository _logRepository; public LogController(ILogRepository logRepository)
{
_logRepository = logRepository;
} [HttpPost]
public void Post([FromBody] Log value)
{
_logRepository.Insert(value);
}
}

3. ASP.NET Core使用Autofac实现依赖注入

  添加安装包:

Install-Package Autofac.Extensions.DependencyInjection

  Startup.cs:

using Autofac;
using Autofac.Extensions.DependencyInjection; // 使用第三方容器,Startup.ConfigureServices 必须返回 IServiceProvider
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); // Autofac
var builder = new ContainerBuilder();
builder.RegisterType<LogRepository>().As<ILogRepository>();
builder.Populate(services);
var container = builder.Build();
return new AutofacServiceProvider(container);
}

ASP.NET Core系列:依赖注入的更多相关文章

  1. ASP.NET Core之依赖注入

    本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...

  2. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

  3. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  4. asp.net core 系列 4 注入服务的生存期

    一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建. 这 ...

  5. 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

    这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...

  6. ASP.NET Core:依赖注入

    ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...

  7. Asp.net core自定义依赖注入容器,替换自带容器

    依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...

  8. asp.net core ioc 依赖注入

    1.生命周期 内置的IOC有三种生命周期: Transient: Transient服务在每次被请求时都会被创建.这种生命周期比较适用于轻量级的无状态服务. Scoped: Scoped生命周期的服务 ...

  9. asp.net core 系列 3 依赖注入服务

    一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S).开放封闭原则(O).里氏替换原则(L).接口分离原则(I).依赖反转原则(D). ...

  10. asp.net core 系列之Dependency injection(依赖注入)

    这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...

随机推荐

  1. 从0系统学 Android--1.1认识 Android

    一转眼工作也有几年的时间了,一直想沉下心来,再回过头来重新系统的学习一遍 Android.所以就有了这个读书笔记.俗话说温故而知新,下面就请大家再跟着我系统的学习一篇 Android 吧! 这一系列主 ...

  2. 15.Java基础_初探对象

    package pack1; public class Phone { //成员变量 String brand; int price; //成员方法 public void call(){ Syste ...

  3. pycharm添加断点,分段运行,以及继续运行;

    1.打断点,只需在代码的前面单机左键即可:2.运行,点击Debug...(如图,像贝壳一样的图标),只会运行第一个红点前的代码: 3.此时若想将第2个红点前的代码运行完毕:点击Resume Progr ...

  4. Linux学习(五)远程登录

    Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器. 这时我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中是通过ssh服务实现的远程登录功 ...

  5. Linux学习(一)简介

    Linux 简介 Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix 操作系统 ...

  6. 执行DOS命令并返回结果

    public static String excuteCommand(String command){ Runtime runtime = Runtime.getRuntime(); try { Pr ...

  7. 201271050130-滕江南《面向对象程序设计(java)》第十一周学习总结

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  8. Linux通过端口号查看使用进程-结束进程

    1. 查看进程(参数带 - 与不带有区别): command [options] 例:ps  -a(配合其他options参数以展示进程更多参数) ps -ef | grep 进程名(返回值是该进程的 ...

  9. Keras:

    https://keras.io/zh/layers/core/ keras使用稀疏输入进行训练 2018.06.14 12:55:46字数 902阅读 760 稀疏矩阵 稀疏矩阵是指矩阵中数值为0的 ...

  10. ES6 Set求两个数组的并集、交集、差集;以及对数组去重

    并集: const arr1 = [1, 2, 3, 2, 5]; const arr2 = [1, 4, 6, 8, 3]; // 将两个数组合并 const concatArr = [...arr ...