.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);

同时也要注册控制器,一开始我去写的的时候没有注册控制器,然后会报构造函数不能为空的错误!

生命周期

  1. InstancePerDependency:每次解析时都创建一个新的实例。这是默认的生命周期管理方式。
  2. SingleInstance:整个应用程序中只创建一个实例,并在后续的解析中重用该实例。
  3. InstancePerLifetimeScope:每个生命周期范围内只创建一个实例。生命周期范围可以通过Autofac的BeginLifetimeScope()方法创建。
  4. InstancePerMatchingLifetimeScope:与InstancePerLifetimeScope类似,但只有在解析时与指定的生命周期范围匹配时才会创建实例。
  5. InstancePerRequest:在Web应用程序中,每个HTTP请求都创建一个新的实例。这通常用于在Web API或MVC应用程序中注册服务。
  6. InstancePerOwned:在每个Owned<T>上创建一个新的实例。Owned<T>是一个特殊的类型,用于在需要时创建和释放实例。

参考资料

.Net Framework使用Autofac实现依赖注入的更多相关文章

  1. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  2. Autofac之依赖注入

    这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...

  3. Web API(六):使用Autofac实现依赖注入

    在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...

  4. NET Core源代码通过Autofac实现依赖注入

    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性   阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...

  5. 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性

    一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...

  6. 【AutoFac】依赖注入和控制反转的使用

    在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...

  7. WebAPi使用Autofac实现依赖注入

    WebAPi依赖注入  使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax  ----Application_Start 应用程序启动时 using Autofa ...

  8. Autofac 泛型依赖注入

    using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...

  9. 五:.net core(.NET 6)使用Autofac实现依赖注入

    Autofac的简单使用: 由于将来可能引用很多包,为了保持统一队形,我们再新建一个类库项目Wsk.Core.Package,当做包的引用集合: 删掉Class1,把Wsk.Core.Wsk.Core ...

  10. 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法

    之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...

随机推荐

  1. 建立成功平台工程的关键:自助式 IaC

    从技术上讲,云一直都是自助式服务,但由于其在实践中的复杂性,许多开发人员并不喜欢.随着公司采用现代架构(云原生.无服务器等)和新的提供商(多云.SaaS 应用程序),以及云提供商发布更多服务,云变得更 ...

  2. CCE云原生混部场景下的测试案例

    本文分享自华为云社区<CCE云原生混部场景下在线任务抢占.压制离线任务CPU资源.保障在线任务服务质量效果测试>,作者:可以交个朋友. 背景 企业的 IT 环境通常运行两大类进程,一类是在 ...

  3. SQL函数详解SUM\COUNT\AVG......

    朋友们,个人公众号:SQL数据库运维 移动端的学习分享,各种数据库基础知识,一起进步,共同学习,期待你的加入. 函数的类型 1.聚合函数:对一组值执行计算,并返回单个值,也被称为组函数.聚合函数经常与 ...

  4. SQL Server 数据库分析操作程序时SQL语句等待或执行时间较长(死锁)

    大型程序,总会遇到程序操作端卡顿或者直接遇到死锁,死锁是数据库设计的缺陷,虽不能完全避免死锁的出现,但一旦出现死锁我们要进行及时分析死锁语句,找出原因,进行SQL语句或程序的优化,避免再次出现同样的问 ...

  5. 详解GaussDB(DWS)中的行执行引擎

    本文分享自华为云社区<GaussDB(DWS)行执行引擎详解>,作者:yd_227398895. 1.前言 GaussDB(DWS)包含三大引擎,一是SQL执行引擎,用来解析用户输入的SQ ...

  6. Echarts设置饼状图保证你看的明明白白

    简单的饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  7. debug技巧之使用Arthes调试

    一.前言 大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦. 前面我介绍了本地调试和远程调试,今天再 ...

  8. 到今天了你还不会集合的Stream操作吗?你要out了

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  9. Newtonsoft.Json 首字母小写

    // 首字母小写 JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings(); jsonSerialize ...

  10. request to https://registry.npm.taobao.org/cnpm failed, reason: certificate has expired

    换华为的,否则会出问题:cnpm confg set registry https://mirrors.huaweicloud.com/repository/npm/ npm ERR! code CE ...