ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下
先简单了解一这个几个 名词的意思。
控制反转(IOC) 依赖注入(DI) 并不是某种技术。 而是一种思想。一种面向对象编程法则
什么是控制反转(IOC)? 什么是依赖注入(DI)
可以点击下面链接 理解的比较详细
https://blog.csdn.net/PacosonSWJTU/article/details/52786216
https://www.cnblogs.com/Mr-Rocker/p/7721824.html
控制反转(IOC)
在之前传统应用程序 我们都是在类内部主动实例化依赖对象,从而导致类与类之间高耦合,难于测试
可以看到下图类与类之间 依赖关系很紧密
(图是我盗的。感谢做这个图的大佬)
IOC 就是一种容器 把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
IOC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

依赖注入(DI)
依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台
依赖谁? 依赖于IOC容器
注入谁 ? 由IoC容器注入应用程序某个对象,应用程序依赖的对象;
被依赖者并不是有依赖者主动去初始化 而是有提供资源的外部创建者决定
两者关系也就是 被注入对象依赖IoC容器配置依赖对象
说到DI IOC 就有必要了解下 现在用的最多的AutoFac
首先在项目中引入 AutoFac 如果你是WebAPI 你可以输入 AutoFac.WebApi2

我定义了 两个仓储类 IRepositoryBase 和 RepositoryBase 主要用于操作数据库的各种方法
public interface IRepositoryBase<T> where T:class
{ IQueryable<T> FindAll(); T FindSingle(Expression<Func<T, bool>> exp = null); T Find(int id); IQueryable<T> Find(Expression<Func<T, bool>> exp = null); /// <summary>
/// Linq表达式树查询分页
/// </summary>
/// <returns></returns>
IQueryable<T> Find(int pageindex = , int pagesize = , Expression<Func<T, bool>> exp = null); /// <summary>
/// 得到受影响条数
/// </summary>
/// <returns></returns>
int GetCount(Expression<Func<T, bool>> exp = null); void Add(T entity); void AddBatch(T[] entitys); void AddBatch(List<T> entitys); /// <summary>
/// 更新实体所有属性
/// </summary>
/// <returns></returns>
void Update(T entity); void Delete(T entity); /// <summary>
/// 按指定的ID进行批量更新
/// </summary>
void Update(Expression<Func<T, object>> identityExp,T entity); T Update(T entity,int id); /// <summary>
/// 批量删除
/// </summary>
void Delete(Expression<Func<T, bool>> exp); void Save(); int ExecuteSql(string sql);
}
继承接口并实现
public class RepositoryBase<T> : IRepositoryBase<T> where T:class
{
protected OpenSPDBContext openSPDBContext = new OpenSPDBContext(); public void Add(T entity)
{
openSPDBContext.Set<T>().Add(entity);
Save();
} public void AddBatch(T[] entitys)
{
openSPDBContext.Set<T>().AddRange(entitys);
Save();
} public void Delete(Expression<Func<T, bool>> exp)
{
var entitys= openSPDBContext.Set<T>().Where(exp);
openSPDBContext.Set<T>().RemoveRange(entitys);
} public void Delete(T entity)
{
openSPDBContext.Set<T>().Remove(entity);
Save();
} public int ExecuteSql(string sql)
{
return openSPDBContext.Database.ExecuteSqlCommand(sql);
} public IQueryable<T> Find(Expression<Func<T, bool>> exp = null)
{
return Filter(exp);
} public T Find(int id)
{
return openSPDBContext.Set<T>().Find(id);
} public IQueryable<T> Find(int pageindex, int pagesize, Expression<Func<T, bool>> exp = null)
{ return Filter(exp).Skip(pagesize * (pageindex - )).Take(pagesize);
} public IQueryable<T> FindAll()
{
return openSPDBContext.Set<T>();
} public T FindSingle(Expression<Func<T, bool>> exp = null)
{
return openSPDBContext.Set<T>().AsNoTracking().FirstOrDefault(exp);
} public int GetCount(Expression<Func<T, bool>> exp = null)
{
return Filter(exp).Count();
} public void Update(T entity)
{
openSPDBContext.Entry(entity).State = EntityState.Modified;
Save();
} /// <summary>
/// 按指定id更新实体,会更新整个实体
/// </summary>
/// <param name="identityExp">The identity exp.</param>
/// <param name="entity">The entity.</param>
public void Update(Expression<Func<T, object>> identityExp, T entity)
{
openSPDBContext.Set<T>().AddOrUpdate(identityExp, entity);
} public IQueryable<T> Filter(Expression<Func<T,bool>> exp)
{
var dbset = openSPDBContext.Set<T>().AsQueryable();
if (exp != null)
dbset = dbset.Where(exp); return dbset; } public void Save()
{
try
{
openSPDBContext.SaveChanges();
}
catch (DbEntityValidationException e)
{
throw new Exception(e.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage);
throw;
}
} public void AddBatch(List<T> entitys)
{
openSPDBContext.Set<T>().AddRange(entitys);
} public T Update(T entity, int id)
{
openSPDBContext.Entry(entity).State = EntityState.Modified;
Save();
return openSPDBContext.Set<T>().Find(id);
}
}
然后 在全局类中注册依赖配置

我新建了个逻辑处理层 Server 用来方便控制调用 这里我依赖了IRepositoryBase<T>
public class ShopingServer : IShopingServer
{
private IRepositoryBase<ShopingInfo> _shopingRepository;
public ShopingServer(IRepositoryBase<ShopingInfo> shopingRepository)
{
_shopingRepository = shopingRepository;
} public IQueryable<ShopingInfo> GetAll()
{
var ss = _shopingRepository.FindAll();
return ss;
}
}
然后控制器 注入 (这里 我依赖了IRepositoryBase IShopingServer) IShopingServer 是我定义的服务类接口 这里我就不贴出来了

我们 分别调用一下 IRepositoryBase IShopingServer 里面的一个方法 测试一下

可以看到 已经注入成功了 小菜也有梦想。 每天一点点
ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下的更多相关文章
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...
- 依赖注入 DI 控制反转 IOC MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 依赖注入 DI 控制反转 IOC 概念 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路
开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core 中的依赖注入
目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
随机推荐
- 装箱问题(NOIP2001&水题测试2017082401)
题目链接:装箱问题 这题经典的01背包. 动规. 设计状态f[n][V]表示前n个物体放在V中的最大体积是多少. 所以代码如下: #include<bits/stdc++.h> using ...
- 关于syslog日志功能详解 事件日志分析、EventLog Analyzer
关于syslog日志功能详解 事件日志分析.EventLog Analyzer 一.日志管理 保障网络安全 Windows系统日志分析 Syslog日志分析 应用程序日志分析 Windows终端服务器 ...
- zabbix实现企业微信监控报警
一.zabbix基本说明 简介:zabbix基于Web界面的分布式系统监控的企业级开源软件.可以监控各种系统与设备,网络参数,保证服务器设备安全运营:提供灵活的通知机制.如果检测到的指标不达标,就实现 ...
- 19 模块之shelve xml haslib configparser
shelve 什么是shelve模块 也是一种序列化方式使用方法 1.opne 2.读写 3.close特点:使用方法比较简单 提供一个文件名字就可以开始读写 读写的方法和字典一致 你可以把它当成带有 ...
- mac挂载ntfs文件系统方法
1.插入磁盘,并查看 zz@pzdeMacBook-Pro:~/Volumes/ntfs16g$ df Filesystem 512-blocks Used Available Capacity iu ...
- zend studio导入外部项目乱码怎么解决
在zendstudio ide中,导入一个工程后,发现工程里面很多的文件都打上了红色的叉叉,打开这些文件一看,发现只要是有汉字存在的文件,都出现了乱码.按住alt+enter发现,该文件的编码默认为g ...
- fastq-to-fasta转换及fasta拆分、合并
格式转换: use awk :awk 'BEGIN{P=1}{if(P==1||P==2){gsub(/^[@]/,">");print}; if(P==4)P=0; P++ ...
- 百度地图经纬度和地址互转(Java代码)
这是基于springmvc+mybatis 的一个controller.如果不是这个框架,可以把方法实体抽到自己写的一个类中,然后再测试 package com.uwitec.controller.s ...
- HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)
题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...
- 启动Android App时,动态将Sqlite数据库文件导入到手机中类方法
package com.aqioo.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStre ...