AutoFac实现WebAPI依赖注入(EF以及Mysql)
什么是依赖注入?
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public class ProductContext: DbContext
{
public ProductContext(): base( "ProductContext")
{ }
public DbSet< Product> Products { get; set; }
}
public class ProductRepo_EF
{
private ProductContext _ctx = new ProductContext ();
public IEnumerable<Models.Product > GetAll()
{
return _ctx.Products.ToList();
} public Models. Product GetProduct( int id)
{
return _ctx.Products.FirstOrDefault(x=>x.ID==id);
}
}
public class ProductsController : ApiController{
//这一行是问题根源所在
ProductRepository _repository = new ProductRepository();
public IEnumerable<Product> Get()
{
return _repository.GetAll();
}
public IHttpActionResult Get(int id)
{
var product = _repository.GetByID(id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}}
我们的productController是依赖于productRespository来提供数据的,也就是我们形象的说法,这个controller依赖于_respository的实现。那如果我们的repo发生变化,甚至我们将不准备采用EF针对sqlserver提供的方式,我们想更换针对mysql的实现,如果有很多controller都依赖于repo的实现,那代码的改动量将会很巨大,而且很容易犯错。这在真正的工业代码中将是无法想象的。 所以我们必须采用以来注入的松耦合实现方式。
public interface IProductRepository{
IEnumerable<Product> GetAll();
Product GetById(int id);
}
public class ProductRepository : IProductRepository{
//
}
public class ProductsController : ApiController{
private IProductRepository _repository;
public ProductsController(IProductRepository repository)
{
_repository = repository;
}
}
利用构造函数向外界暴露依赖,这样在再创建不同的实例的时候,只需要提供不同的实现就可以了,在代码内部则不会发生改动。关于更多依赖注入的基础知识,可以自行搜索,实在太多。我们这里针对webapi的依赖注入。 在mvc以及webapi中,与业务逻辑打交道,那就肯定少不了controller对于业务类(比方说Repo)的依赖。那这里想要实现解耦,就要控制controller实例的创建,但是在mvc框架中controller的创建是由框架自行完成的..顿时觉得无从下手了。在mvc2.0中,如果使用DefaultControllerFactory的实现,创建controller实例是通过反射调用无参构造函数来实现的。那我们想要使用默认工厂来通过构造函数注入,显然是不现实的。只能整体更换整个工厂。而随着mvc框架的发展,到mvc4的时候,框架已经对于外部的以来注入实现已经相当友好了。默认工厂不再通过单一的无参构造函数反射创建实例,而是统一的通过IDependencyresolver接口提供的 IDependencyResolver.GetService(Type serviceType)
方法来暴露实现。在创建controller实例的时候,首先通过该方法去取得controller实例,如果为null在调用无参构造创建实例。 所以我们只需要使用外部IOC容器扩展针对IDependencyResolver的实现即可。
外部IOC容器常用的有 Unity Autofac Ninject 等等。我们这里采用AutoFac做为我们的实现。因为文档齐全,效率高,功能强大,也是主流IOC容器。
使用autofac可以自行创建,也可以采用autofac官方针对webapi的扩展。 通过Nuget安装 autofac 以及autofac.extentions.webapi。将自动有AutofacWebApiDependencyResolver实现。
在global.asax中
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
//仅仅这一个地方的改动,就达到了对数据库的无缝链接。
builder.RegisterType<ProductRepo_EF>().As<IProductRepo>();
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
在这里我们使用了EF和EF to Mysql两种repo实现,也就是通过两种数据库提供数据。
备注一下,使用EF To Mysql需要安装mysql数据库,以及在nuget包中

并且在web.config中提供mysql以及sqlserver两种连接字符串即可。
这样 ,当我们需要更换不同的repo实现的时候只需要在
替换成
AutoFac实现WebAPI依赖注入(EF以及Mysql)的更多相关文章
- net core WebApi——依赖注入Autofac
目录 前言 Autofac 添加一个Util来随时调用 小结 代码地址 前言 周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3. ...
- AutoFac IoC DI 依赖注入
AutoFac IoC DI 依赖注入 记录点点滴滴知识,为了更好的服务后来者! 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌 ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)
原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...
- WebAPi使用Autofac实现依赖注入
WebAPi依赖注入 使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax ----Application_Start 应用程序启动时 using Autofa ...
- Web API(六):使用Autofac实现依赖注入
在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...
- ASP.NET Core搭建多层网站架构【9.1-使用Autofac代替原生的依赖注入】
2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1 摘要:基于ASP.NET Core ...
- 记录对依赖注入的小小理解和autofac的简单封装
首先,我不是一个开发者,只是业余学习者.其次我的文化水平很低,写这个主要是记录一下当前对于这块的理解,因为对于一个低水平 的业余学习者来说,忘记是很平常的事,因为接触.应用的少,现在理解,可能过段时间 ...
- 依赖注入容器Autofac与MVC集成
Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...
随机推荐
- flask_maple使用文档
安装 To install Flask-Maple: pip install flask-maple Or alternatively, you can download the repository ...
- 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)
Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式 √ id:标识容器中的bean.id唯一. √ cl ...
- mysql 存储过程 游标嵌套
基本表temp 包括 name, type, sendCity, getCity 分别对应物流送货司机名, 倒车的第几段, 发货城市, 收货城市 表结构 -- -------------------- ...
- Swift 里 Array (二)初始化
init() 函数 在 Array 里 public init() { _buffer = _Buffer() } 以Buffer 是 _ContiguousArrayBuffer 为例. 即初始化了 ...
- h5文字超出,两行显示,超出显示省略号
最近接到一个需求,要求商场导航里的文字最多显示两行,超出两行的省略号显示,查一些资料,又根据自己的需求,改了很多,直接上代码吧 <html> <head> <style ...
- GPS轨迹数据可视化的三种途径
有一阵子没写过博客了,最近因为自己小队申请了项目有并且要帮研究生做一些数据处理的小任务,接触到可视化.这里介绍最近学到的了三种方法. 第一种是用python. 这里原理是用matplotlib里面的s ...
- [Leetcode]123.买卖股票的最佳时机3
[原题链接][https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/] 分析:动态规划+二分法.以第i天为分界线,计 ...
- 【sping揭秘】12、SpringAOP的实现机制
SpringAOP的实现机制 设计模式代理模式 参考我之前的代理模式 http://www.cnblogs.com/cutter-point/p/5226642.html 这里写个简单的案例 pack ...
- C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)
常规的调用ToString()方法,存在两个问题. (1).调用者无法控制字符串的格式 (2).调用者不能方便的选择一种特定的语言文化来格式化字符串. 在开发一些国际化的应用时,应用程序需要调用与当前 ...
- [Python 从入门到放弃] 5. 文件与异常(一)
1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...