.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项目, ...
随机推荐
- Service Worker 缓存文件处理
交代背景 前段时间升级了一波Google Chrome,发现我的JulyNovel站点Ctrl+F5也刷新不了,后来发现是新的Chrome已经支持Service Worker,而我的JulyNovel ...
- C#应用程序所有已经打开的窗体的集合
获取所有打开的窗体的集合 Application.OpenForms 获取其中的某个窗体 Application.OpenForms["窗体名"]
- STM32开发(一):简介及开发环境
1. 背景 STM32是意法(ST)公司开发的基于ARM Cortex-M系列的一系列微控制器(MCU). 有两种库 标准外设库(StdPeriph_Driver.Standard Periphera ...
- C#中Attribute/特性的使用
类似Java的注解/Annotation 特性是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签,这个标签可以有多个.您可以通过使用特性向程序添加声明性信息.一 ...
- mysql用户增删改
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...
- [转]解读Unity中的CG编写Shader系列9——镜面反射
讨论完漫反射之后,接下来肯定就是镜面反射了在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别.注:这篇文章实现的镜面反射是逐顶点着色(per-ver ...
- Echart自定义y轴刻度信息1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- WEB新手之do u know caidao?
继续写题. 进入该网站,可以看到显然题目给出了一个假的flag.再看第二句话,说题目里存在shell.于是用御剑扫描一下后台. 如上图所示,扫出了一个叫shell的包.于是常识性地在URL加上shel ...
- Sublime Text3 最新版3207 安装及破解
注:原文地址 https://www.abbeyok.com/archives/337 Sublime Text 3最近更新了新版本,最新版本:3207,之前的license无效了,新版破解方法如下: ...
- 你不可不知的 React Native 混合用法(Android 篇)
前言 当前 React Native 虽说版本更新比较快,各种组件也提供的很全面了,但是在某些情况下,混合开发的方式才会快速缩短开发周期,原因无非就是原生平台的"底蕴"无疑更深,拥 ...