.netCore2.0 依赖注入
依赖注入(ID)是一种实现对象及其合作者或者依赖想之间松散耦合的技术
对于传统的方法来说,获取类的方法通常用new如下
public class DIController : Controller
{
public IActionResult Index()
{
MyServices my = new MyServices();
my.getName();
return View();
}
}
但是问题来了,如果我后期要修改MyServices类的时候,就需要在整个项目中来搜索修改
一:接口注入
为了实现解耦,我们需要建立IServices的接口,然后类实现接口,在控制器中进行构造函数,初始化接口,然后使用接口来进行操作,这样就达到了解耦的目的,俗称依赖注入
具体类代码如下
namespace CoreWeb2.Services
{
public class MyServices:IServices
{
public string getName()
{
return "张三";
}
}
public class OServices:IServices
{
public string getName()
{
return "李四";
}
}
public interface IServices {
string getName();
}
}
控制器代码如下:
namespace CoreWeb2.Controllers
{
public class DIController : Controller
{
/// <summary>
/// 通过构造函数初始化接口
/// 在外界使用时候直接new出具体类,这样就达到了程序解耦的目的,俗称依赖注入
/// </summary>
public IServices _services;
public DIController(IServices services)
{
this._services = services;
}
public IActionResult Index()
{
//通过接口调用
_services.getName();
return View();
}
}
}
但是问题又来了,因为控制器默认构造函数是一个无参的,现在增加了参数传递,直接访问会报错误,因而就需要在Startup.cs中的ConfigureServices方法中进行程序注入,将构造函数的参数注入到容器中,当程序访问时会自动在容器中找参数,才可以使用
依赖注入有三种方式:
1、AddTransient
每个请求创建一个
2、AddScoped
一个域创建一个
3、AddSingleton
单例,整个应用程序生命周期以内只创建一个实例
//每个请求创建一个
services.AddTransient<IServices, MyServices>();
//一个域创建一个
services.AddScoped<IServices, MyServices>();
//单例,整个应用程序生命周期以内只创建一个实例
services.AddSingleton<IServices, MyServices>();
当程序进行依赖注入后,控制器中就可以访问到当前的实例对象了,
二:泛型注入
泛型接口
/// <summary>
/// 数据仓储
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IRepository<TEntity> where TEntity : class
{
DbContext DbContext { get; } DbSet<TEntity> Entities { get; }
IQueryable<TEntity> Table { get; }
TEntity GetById(object id);
void Insert(TEntity engine, bool isSave = true);
void Update(TEntity engine, bool isSave = true);
void Delete(TEntity engine, bool isSave = true);
}
泛型接口实现
public class EfRepository<TEntity> : IRepository<TEntity> where TEntity:class
{
private GeneralDbContext _dbContext;
public EfRepository(GeneralDbContext generalDbContext)
{
_dbContext = generalDbContext;
} public DbContext DbContext => _dbContext; public DbSet<TEntity> Entities => _dbContext.Set<TEntity>(); public IQueryable<TEntity> Table => Entities; public void Delete(TEntity engine, bool isSave = true)
{
Entities.Remove(engine);
if (isSave)
{
_dbContext.SaveChanges();
}
} public TEntity GetById(object id)
{
return _dbContext.Set<TEntity>().Find(id);
} public void Insert(TEntity engine, bool isSave = true)
{
Entities.Add(engine);
if (isSave)
{
_dbContext.SaveChanges();
}
} public void Update(TEntity engine, bool isSave = true)
{
Entities.Update(engine);
if (isSave)
{
_dbContext.SaveChanges();
}
}
泛型注入方式
//将泛型注入 services.AddScoped(typeof(IRepository<>),typeof(EfRepository<>));
关联类GeneralDbContext
public class GeneralDbContext : DbContext
{
public GeneralDbContext(DbContextOptions options) : base(options)
{ }
public DbSet<Category> Categorys{ get; set; }
}
.netCore2.0 依赖注入的更多相关文章
- 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理
05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...
- 06、NetCore2.0依赖注入(DI)之整合Autofac
06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...
- 07、NetCore2.0依赖注入(DI)之生命周期
07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...
- asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客
原文:asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客 原文地址:http://www.tnblog.net/aojiancc2 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- .Net Core 3.0依赖注入替换 Autofac
今天早上,喜庆的更新VS2019,终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入,因为Startup.ConfigureServices不能再把返回值改成IServiceProvide ...
- [译]ASP.NET Core 2.0 依赖注入
问题 如何使用 ASP.NET Core 服务容器进行依赖注入? 答案 创建一个服务 public interface IGreetingService { string Greet(string t ...
- 学习yii2.0——依赖注入
依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...
- .Net Core3.0依赖注入DI
构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法. 不使用依赖注入 首先,我们创建一个ASP.NET Core Mvc项目, ...
随机推荐
- cesium编程入门(七)3D Tiles,模型旋转
cesium编程入门(七)3D Tiles,模型旋转 上一节介绍了3D Tiles模型的位置移动,和贴地的操作,这一节来聊一聊模型的旋转, 参考<WebGl编程指南>的第四章 假设在X轴和 ...
- system idle process
偶然发现windows环境任务管理其中存在进程 system idle process,cpu占用极大但内存占用很小.google了一下,保存下结果 system idle process :系统空闲 ...
- 安全测试---AWVS简单安装介绍
使用AWVS对域名进行全局分析,深入探索: 首先,介绍一下AWVS这个工具. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网 ...
- Mayor's posters 线段树区间覆盖
题目链接 http://poj.org/problem?id=2528 Description The citizens of Bytetown, AB, could not stand that t ...
- Java内存管理笔记
java内存管理机制 在java中,内存管理由JVM完全负责,java中的"垃圾回收器"负责自动回收无用对象占据的内存资源,这样可以大大减少程序猿在内存管理上花费的时间,可以更集中 ...
- kvm linux虚拟机在线扩展磁盘
说明: 1) vmware ESXi虚拟化平台也支持这台在线扩展磁盘功能. 2) kvm虚拟机也支持在线扩展磁盘功能,在线扩展有特定的使用环境,主要用于不能随便停用的生产环境中. 3) 经过测试KVM ...
- SFML从入门到放弃(1) 窗口和交互
SFML从入门到放弃(1) 窗口和交互 创建一个新窗口: sf::RenderWindow window(sf::VideoMode(,),"new window"); 但是光创建 ...
- Lvs IP负载均衡技术
Lvs集群的通用结构 Lvs集群采用IP负载均衡技术,属于IP层的交换(L4),具有很好的吞吐率.调度器分析客户端到服务器的IP报头信息,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器 ...
- WordPress翻译更新失败解决方法
编辑php的配置文件:php.ini,搜索并找到disable_functions: 删除disable_functions后面的scandir字符串,保存php.ini: 重载或重启php-fpm服 ...
- 本机安装mysql服务
Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,你需要在 MySQL 下载中下载 Windows 版本的 MySQL 安装包. Download Link: ...