.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项目, ...
随机推荐
- 【Selenium专题】WebDriver启动firefox浏览器
firefox浏览器不需要下载驱动,原生支持,以下是代码运行环境,firefox启动封装在方法startFirefox()中 import org.openqa.selenium.WebDriver; ...
- 【Android 多媒体应用】使用MediaCodec解码使用AudioTrack播放音频数据
1.MainActivity.java import android.app.Activity; import android.os.Bundle; import android.os.Environ ...
- Maximum splitting(规律,数论)
You are given several queries. In the i-th query you are given a single positive integer ni. You are ...
- jquery源码解析:jQuery工具方法when详解
我们先来看when方法是如何使用的: var cb = $.when(); //when方法也是返回一个延迟对象,源码是return deferred.promise();返回的延迟对象不能修改状 ...
- iOS开发之动画中的时间(概况)
一.引言 在iOS开发中使用动画时,可以通过设置动画的duration.speed.begintime.offset属性,来设置动画的时长.速度.起始时间及起始偏移. 用一个简单的例子来说明各个参数的 ...
- PHP初步:在Mac OS X Yosemite下搭建Apache+PHP+Mysql
Mac OS X是基于unix的操作系统,很多软件都集成在系统中.所以,对于配置PHP的开发环境相对于windows和Linux更简单. 1. 启动Apache服务器 打开终端(terminal),查 ...
- 通过cookie绕过验证码登录
在我们做自动化的时候碰到一些比较难破解的验证码时是非常头疼的,一般来说最好的办法就是让开发屏蔽,这样最有益身心健康. 那么今天我介绍的这个方法也挺简单的,就是通过添加cookie的方式绕过验证码直接登 ...
- 2019.2.14 t3 车辆销售
用算法求最大生成树,在并查集合并时,把原本的一个根连向另一个 根改成两个根都连向一个新建的节点,并把当前正在处理的边的权值赋给这个新 节点做点权.这样形成的结构会是一棵树. 一个点的答案大致上是树的根 ...
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
- Gsteramer 环境配置
安装命令: sudo add-apt-repository universe sudo add-apt-repository multiverse sudo apt-get update sudo a ...