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. 【C#】学习笔记(2)委托Delegate相关

    泛型委托类型,同样是根据杨老师的视频来的. 直接上栗子

  2. Python之Beautiful Soup 4使用实例

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航.查找.修改文档的方式.Beautiful Soup 4 官方文档: ...

  3. 实时数据推送webSocket

    实时数据推送 在Web或移动项目中,服务器向客户端实时推送消息是一种常见的业务需求. 实现方式 Polling:轮询(俗称“拉”),即定期重新请求数据. Long-Polling:长轮询,是 Poll ...

  4. BayaiM__MySQL 5.7 新特性详解

    原创 作者:bayaim 时间:2016-06-15 11:40:50 122 0                            阅读(22130) | 评论(43443) | 转发(3232 ...

  5. 在宿主机上执行docker容器内部的shell或程序

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...

  6. k8s中的client-go编译成功

    要分版本的,好像1.4跟12差别好大. 1.4中用的模块管理还是vendor,12就换成mod了. 这个要记住差异. 一,从github上下载client-go的1.4版本 https://githu ...

  7. centos7.6离线安装mysql5.7(附下载链接)

    本来打算直接用原生yum源安装,但是跨国访问网络太慢,只好采用离线安装的方式,原理就是把所需的rpm下载下来再上传服务器安装. 1.rpm文件下载地址: 目录: http://repo.mysql.c ...

  8. 第十五周博客作业 <西北师范大学| 周安伟>

    第十五周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10946673 ...

  9. linux shell脚本命令

    sort命令 sort #按照字典序排序 sort -n #以数值来排序,避免10比2小的情况 sort -k #如果文件有多列,指定排序的列 sort -r #逆序排列 uniq 命令 sort t ...

  10. Python学习笔记2基本语法规则_20170611

    # 1.print 显示示例 print('Hello, World!') 逗号分割变量,输出插入空格 name = 'BB' print('AA', name) # output: >> ...