ASP.NET Core 使用 AutoFac 注入 DbContext
DI 1.0 —— 通过 RegisterInstance
注入
一开始,并不是很懂 AutoFac 的用法,又因为要使用特定的构造器和参数来初始化 DbContext
,所以我想到的办法就是使用 RegisterInstance
,代码如下:
var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
optionsBuilder.UseMySql(connectionString, b => b.MigrationsAssembly("BookList.Domain"));
// SingleInstance 就是单例模式,现在想起来当时写的好智障
containerBuilder.RegisterInstance(new BookListDbContext(optionsBuilder.Options)).SingleInstance();
一开始在本地用 Swagger 一个一个的调试 api 的感觉还很好,没啥问题,后来前端同学把 js 加上,就会经常的出现 404。经过 debug 发现,是 DbContext
出现了冲突,多个请求同时访问同一个 DbContext
对象,造成异常,虽然不清楚为啥没有出现500而是404。
DI 2.0 —— 添加 IDbContext
接口,通过 RegisterType
注入
知道了问题所在,就想到了更换服务的生命周期设置,于是我在上面的代码的基础上直接把 SingleInstance
改成了 InstancePerLifetimeScope
,但在运行时遇到了异常,原来 RegisterInstance
仅支持 SingleInstance
。既然这样,那就接着换,于是我在网上发现了别人通过让自定义的 DbContext
实现一个 IDbContext
接口,进行依赖注入,代码如下:
// ··········· 省略 IDbContext 的定义
var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
optionsBuilder.UseMySql(connectionString, b => b.MigrationsAssembly("BookList.Domain"));
containerBuilder.RegisterType<MyDbContext>()
.As<IDbContext>()
.WithParam("options",optionsBuilder.Options)
.InstancePerLifetimeScope();
这样一来,我们就需要提取一个 IDbContext
,这个工作有些麻烦,但是在 ReSharper 的帮助下,简化了不少。然而,这个方法并没有生效,现在消费者类依赖 IDbContext
接口的一个实例,但是在实例化服务的时候却抛出了异常。。。
很蛋疼,刚刚提取出来的接口白费了。
DI 3.0 —— 使用 Register
方法
其实这个是我根据 Intellisence 试出来的,代码如下:
// 首先注册 options,供 DbContext 服务初始化使用
containerBuilder.Register(c =>
{
var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
optionsBuilder.UseMySql(connectionString, b => b
.MigrationsAssembly("BookList.Domain"));
return optionsBuilder.Options;
}).InstancePerLifetimeScope();
// 注册 DbContext
containerBuilder.RegisterType<BookListDbContext>()
.AsSelf()
.InstancePerLifetimeScope();
实验证明,这样注入 DbContext
是没有问题的
ASP.NET Core 使用 AutoFac 注入 DbContext的更多相关文章
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 使用 autofac 实现 asp .net core 的属性注入
使用 autofac 代替 asp .net core 默认的 IOC 容器,可实现属性注入. 之前的使用方式不受影响. 源码已开源: dotnet-campus/Autofac.Annotation ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- (2)ASP.NET Core 依赖关系注入(服务)
1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等老生常谈的概念,初学者很容易被这些概念搞晕(包括我在内),在 ...
- Asp.Net Core中创建多DbContext并迁移到数据库
在我们的项目中我们有时候需要在我们的项目中创建DbContext,而且这些DbContext之间有明显的界限,比如系统中两个DbContext一个是和整个数据库的权限相关的内容而另外一个DbConte ...
- ASP.NET Core:依赖注入
ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
随机推荐
- HBASE数据模型&扩展和负载均衡理论
示例数据模型 HBase中扩展和负载均衡的基本单元成为region,region本质上是以行健排序的连续存储区间.如果region太大,系统会把它们 自动拆分,相反的,就是把多个region合并,以减 ...
- Sqlserver中 登录用户只能看到自己拥有权限的库
执行之前新建用户时不要赋予任何权限 USE master GO --将所有数据库的查看权限给Public角色,每个登录用户只能查看指定的数据库 --此语句会导致服务器上所有的用户在没有设置数据库权限的 ...
- shell中对字符串的处理
1.替换字符串1为字符串2 sed "s/str1/str2/g" 2.获取字符串中的一部分 例:boke-blade 取得boke:sed -e "s/-.*//g&q ...
- Spring操作指南-IoC基础环境配置(基于XML)
- spark 简介
spark 是基于内存计算的 大数据分布式计算框架,spark基于内存计算,提高了在大数据环境下处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将spark部署在大量廉价的硬件上,形成集群. 1 ...
- haproxy学习之https配置
haproxy学习之https配置 原文 http://www.cnblogs.com/ilanni/p/4941056.html 如何配置https,以及https在实际生产环境中的应用. ...
- php cUrl模拟登录,cookie保存到文件中
源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...
- mark asp.net mvc
http://weblogs.asp.net/scottgu/Tags/MVC http://weblogs.asp.net/scottgu/asp-net-mvc-framework-part-1 ...
- 1.NoSql简介
NoSQL,指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以 ...
- cef 介绍
介绍 cef 是一个基于google chromiun的简单的框架. 它主要是作为一个内嵌浏览器嵌入到客户端应用程序中. 可以再 http://cefbuilds.com 下载最新的编译版本. 总体框 ...