ASP.NET Core系列:依赖注入
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系列:依赖注入的更多相关文章
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- asp.net core 系列 4 注入服务的生存期
一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建. 这 ...
- 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...
- ASP.NET Core:依赖注入
ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- asp.net core ioc 依赖注入
1.生命周期 内置的IOC有三种生命周期: Transient: Transient服务在每次被请求时都会被创建.这种生命周期比较适用于轻量级的无状态服务. Scoped: Scoped生命周期的服务 ...
- asp.net core 系列 3 依赖注入服务
一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S).开放封闭原则(O).里氏替换原则(L).接口分离原则(I).依赖反转原则(D). ...
- asp.net core 系列之Dependency injection(依赖注入)
这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...
随机推荐
- 装上这 10 个插件,你就是这条 Gai 最靓的仔!
直奔主题,给大家推荐 10 个好用的插件. 1.「Adblock Plus」 世界排名第一的免费广告拦截程序 相信大家都有这样的体验,进某个论坛.新闻或者购物网站,广告满天飞,关掉之后还时不时弹出 ...
- 在Dynamis CRM中打造一键保存关闭刷新案例的功能
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复172或者20151114可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 我们知道在Dynamics CR ...
- GitHub 总是打不开,网再好也米有用,怎么办?
所用方法:修改host文件 一.键入网址:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo 拿到github.global.ssl.f ...
- ubuntu下查看(改变)本地端口开放情况,开启和关闭防火墙
查看开放端口: sudo ufw status 允许80端口开放: sudo ufw allow 允许22端口开放: sudo ufw allow 启动防火墙: sudo ufw enable 重启防 ...
- dart lang 开发环境
========================Dart SDK 下载========================Dart SDK 主页: https://dart.dev/toolsDart S ...
- SparkSql 整合 Hive
SparkSql整合Hive 需要Hive的元数据,hive的元数据存储在Mysql里,sparkSql替换了yarn,不需要启动yarn,需要启动hdfs 首先你得有hive,然后你得有spark, ...
- Python数值类型和序列类型
int.float.bool这三个数值类型和常用序列类型的定义和使用 数值类型的基本计算 序列类型的索引取值.切片.成员运算等序列类型的通用操作 complex(复数).decimal(定点数).ma ...
- [Go] gocron源码阅读-go语言中的切片和类型综合
在gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}.. ...
- kettle教程---增量更新
以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:增量抽取(每隔2个小时抽取截至到上次抽取时间的记录) 一.操作前提: 存在3张表,源表 ...
- 第十七周博客作业 <西北师范大学| 周安伟>
第十七周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/11012922 ...