.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项目, ...
随机推荐
- 关于SVN浏览服务器的错误
这种错误是因为URL错误,需要把https://iZ1gyqtig7Z/svn/BoLeBang/ 换成自己的公网ip地址 https://xx.xx.xx.xxsvn/BoLeBang/ 就可以 ...
- Webserver asp配置及伪静态设置
Webserver IIS asp配置及伪静态设置 一.概述: 在Windows Server 2003系统中,用户可以借助IIS 6.0配置基于ASP.PHP.asp.NET等语言的动态Web网站 ...
- 食物(矩阵快速幂)(DP)
这个题..我们可以想到用递推写!!qwq(好吧,其实我的DP水平不高啊qwq) 就是我们以两个为单位(一共九种组合情况),然后往后面推下一位的情况. 通过手动模拟,我们可以找到它们之间的递推关系(详见 ...
- WPF WebBrowser+TabControl MVVM模式 简单应用 提供源码下载
源代码下载 这个程序是TabControl和Webbrowser的练手小程序 可达到练手目的有: MVVM设计模式的基本使用 Binding(包括相对源[RelativeSource]绑定)的基本使用 ...
- while 小项目练习
# (1) 用双层while 写十行十列小星星 j = 0 while j < 10: #打印一行十个小星星 i = 0 while i <10: print("*", ...
- Android中Application类的使用
在最近的Android项目中,有些代码需要从程序的运行周期开始一直到运行周期结束:比如说本地数据库的初始化,从服务器获取数据等:可以说Application对象的生命周期是整个程序中最长的,它的生命周 ...
- “全栈2019”Java第五十三章:向上转型和向下转型详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- POJ - 2387 Til the Cows Come Home (最短路Dijkstra+优先队列)
Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...
- MIT 黑科技:通过脑电波和手势控制机器人
简评:麻省理工黑科技,虽然现在能实现的操作还很简单,但前景(想象空间)非常巨大. 通常,控制机器人并不容易,常规手段就是编程.但是地球上从来不缺天马行空的科学家,今日 MIT 的计算机科学与人工智能实 ...
- python difflib详解
difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. class dif ...