ASP.NET Core 使用 AutoFac 注入 DbContext
2016-09-13 22:08
846 查看
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 Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- 使用Autofac在ASP.NET Web API上实现依赖注入
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- ASP.NET - 使用依赖关系注入在 ASP.NET Core 中编写干净代码
- Asp.Net Core 2.0 之旅---AutoFac 仓储泛型的依赖注入
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Ninject 在 Winform、 Asp.net MVC中结合EntityFramework的使用( 注入同一个DbContext的使用方法) - 原创
- 使用Autofac在ASP.NET Web API上实现依赖注入
- [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码
- 使用AutoFac在ASP.NET Web API上实现依赖注入
- 使用Autofac在ASP.NET Web API上实现依赖注入
- asp.net mvc Autofac 依赖注入框架 使用
- 使用Autofac在ASP.NET Web API上实现依赖注入
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
- Asp.Net MVC 之 Autofac 初步使用2 集成mvc 属性注入以及自动注入
- ASP.NET Core依赖注入解读&使用Autofac替代实现
- ASP.NET Core中使用GraphQL - 第三章 依赖注入