.Net Framework使用Autofac实现依赖注入
.Net Framework使用Autofac实现依赖注入
前言
最近也是找了快2周的工作了,收到的面试邀请也就几个,然后有个面试题目是用asp.net mvc + Entityframework 做一个学生信息增删改查系统。因为题目要求了用Entityframework 也就是EF 那也就不上core了,web项目也是用Framework 4.8去做的。
本文的重点是IOC容器,在Framework 中是没有自带的IOC容器的,那么就需要使用第三方库去实现依赖注入,我这里用的是Autofac。
如果不使用IOC容器去管理类,那么操作数据库和使用类方法则是
using(MydbContext db = new MydbContext){
db....
}
StudentService s = new StudentService();
s.Add();
使用方法
Nuget包
首先需要下载2个Nuget包,分别是:
dotnet add package Autofac --version 7.1.0
dotnet add package Autofac.Mvc5 --version 6.1.0
配置文件
然后在配置文件中,也就是Global.asax.cs文件
然后需要添加如下代码:
// 创建 Autofac 容器生成器
var builder = new ContainerBuilder();
// 注册 EF 上下文
builder.RegisterType<SchoolContext>().InstancePerRequest();
// 注册其他服务
builder.RegisterType<StudentService>().As<IStudentService>().InstancePerRequest();
// 注册控制器
builder.RegisterControllers(typeof(HomeController).Assembly);
// 构建容器
var container = builder.Build();
// 设置 ASP.NET MVC 的依赖解析器为 Autofac
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
上面我注入了一个SchoolContext数据库上下文服务,用于操作数据库
然后注册了StudentService服务,里面是增删改查代码
举个例子:
public interface IStudentService{
//删除
Task<int> DelAsync(int id);
}
public class StudentService:IStudentService
{
private readonly SchoolContext _dbContext;
public StudentService(SchoolContext dbContext)
{
_dbContext = dbContext;
}
public async Task<int> DelAsync(int id)
{
var student = _dbContext.Students.Include("Score").FirstOrDefault(s => s.Id == id);
if (student != null)
{
// 删除关联的成绩表
if (student.Score != null)
{
_dbContext.Scores.Remove(student.Score);
}
// 删除学生
_dbContext.Students.Remove(student);
return await _dbContext.SaveChangesAsync();
}
return 0;
}
}
上面StudentService类实现了IStudentService接口的方法,并且注入了SchoolContext依赖进行数据库操作。
public class HomeController : Controller
{
private readonly IStudentService _studentService;
public HomeController(IStudentService studentService)
{
_studentService = studentService;
}
public async Task<ActionResult> DelStudent(int id)
{
int result = await _studentService.DelAsync(id);
if (result > 0)
{
TempData["SuccessMessage"] = "学生信息删除成功";
return RedirectToAction("Index");
}
TempData["SuccessMessage"] = "学生信息删除失败";
return RedirectToAction("Index");
}
}
上面的控制器则是注入了IStudentService然后就可以调用它的删除学生信息的方法了。
我们需要注意的是需要把数据库上下文和服务类交给容器去管理。
// 注册 EF 上下文
builder.RegisterType<SchoolContext>().InstancePerRequest();
// 注册其他服务
builder.RegisterType<StudentService>().As<IStudentService>().InstancePerRequest();
// 注册控制器
builder.RegisterControllers(typeof(HomeController).Assembly);
同时也要注册控制器,一开始我去写的的时候没有注册控制器,然后会报构造函数不能为空的错误!
生命周期
- InstancePerDependency:每次解析时都创建一个新的实例。这是默认的生命周期管理方式。
- SingleInstance:整个应用程序中只创建一个实例,并在后续的解析中重用该实例。
- InstancePerLifetimeScope:每个生命周期范围内只创建一个实例。生命周期范围可以通过Autofac的
BeginLifetimeScope()方法创建。 - InstancePerMatchingLifetimeScope:与
InstancePerLifetimeScope类似,但只有在解析时与指定的生命周期范围匹配时才会创建实例。 - InstancePerRequest:在Web应用程序中,每个HTTP请求都创建一个新的实例。这通常用于在Web API或MVC应用程序中注册服务。
- InstancePerOwned:在每个
Owned<T>上创建一个新的实例。Owned<T>是一个特殊的类型,用于在需要时创建和释放实例。
参考资料
控制范围和生存期 — Autofac 7.0.0 文档 https://autofac.readthedocs.io/en/latest/lifetime/index.html#example-web-application
NuGet 画廊 |Autofac.Mvc5 6.1.0 https://www.nuget.org/packages/Autofac.Mvc5
.Net Framework使用Autofac实现依赖注入的更多相关文章
- NopCommerce使用Autofac实现依赖注入
NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...
- Autofac之依赖注入
这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...
- Web API(六):使用Autofac实现依赖注入
在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...
- NET Core源代码通过Autofac实现依赖注入
查看.NET Core源代码通过Autofac实现依赖注入到Controller属性 阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...
- 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
- WebAPi使用Autofac实现依赖注入
WebAPi依赖注入 使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax ----Application_Start 应用程序启动时 using Autofa ...
- Autofac 泛型依赖注入
using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...
- 五:.net core(.NET 6)使用Autofac实现依赖注入
Autofac的简单使用: 由于将来可能引用很多包,为了保持统一队形,我们再新建一个类库项目Wsk.Core.Package,当做包的引用集合: 删掉Class1,把Wsk.Core.Wsk.Core ...
- 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法
之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...
随机推荐
- arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇
1.前言: 1.1本实验实现的贪吃蛇能穿越边界,结束游戏的唯一条件是贪吃蛇到达指定长度 1.2本实验所用LCD可能不是LCD12864,LCD12864所用库为u8glib,笔者在词库中并没有找到型号 ...
- windows系统桌面壁纸切换的三种csharp办法,兼容win10及旧版,还有一个现成桌面小程序
我自己用这些代码做的小app如下: 最新版本已经改成了服务的方式,也可以选择性添加系统的右键菜单,并且我自己使用的源码库已经开源到了nuget,大家可以直接拿来做二次开发, 新版的下载地址为:http ...
- goland dlv在远程linux里运行代码开发,并debug调适
一.配置好ssh自动同步代码 参考下面连接: https://www.cnblogs.com/haima/p/13257524.html 二.配置devbug监听运行 GO Remote 填写配置 l ...
- linux打包压缩工具详解
linux打包压缩工具详解 目录 linux打包压缩工具详解 1.linux文件压缩工具 1.1 compress命令详解 1.2 gzip命令详解 1.3 bzip2命令详解 1.4 xz命令详解 ...
- Java IO流文件
Java IO流文件 创建文件 使用File类进行创建文件操作,创建该对象包含三种构造方法 new File(String pathname); //根据路径+文件名创建一个File对象 new Fi ...
- CodePen 的国内替代「笔.COOL」,一个功能完备、使用便捷的在线HTML/CSS/JS编辑器和作品分享平台
笔.COOL,是一个最近在国内崭露头角的在线HTML/CSS/JS编辑器和作品分享平台. 笔.COOL 提供了一个在线的 HTML.CSS 和 JavaScript 代码编辑器.无需任何安装,你只需打 ...
- 免费考AI OCP认证,附通关秘籍!
这是一个能让你快速熟悉AI相关技能的考试,由Oracle官方提供,而且限时免费. 它就是OCI Generative AI Professional. 可以看到,目前免费政策正在执行,到今年的7月31 ...
- Linux之SELinux
1.什么是SELinux? 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SELi ...
- Vue3.0极速入门(二) - 目录和文件说明
目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件 说明 node_modules npm 加载的项目依赖模块 src 这里是我们要 ...
- 莫烦tensorflow学习记录 (3)建造我们第一个神经网络
另一个学习文档http://doc.codingdict.com/tensorflow/tfdoc/tutorials/overview.html 定义 add_layer() https://mof ...