.Net Framework使用Autofac实现依赖注入

这篇具有很好参考价值的文章主要介绍了.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);

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

生命周期

  1. InstancePerDependency:每次解析时都创建一个新的实例。这是默认的生命周期管理方式。
  2. SingleInstance:整个应用程序中只创建一个实例,并在后续的解析中重用该实例。
  3. InstancePerLifetimeScope:每个生命周期范围内只创建一个实例。生命周期范围可以通过Autofac的BeginLifetimeScope()方法创建。
  4. InstancePerMatchingLifetimeScope:与InstancePerLifetimeScope类似,但只有在解析时与指定的生命周期范围匹配时才会创建实例。
  5. InstancePerRequest:在Web应用程序中,每个HTTP请求都创建一个新的实例。这通常用于在Web API或MVC应用程序中注册服务。
  6. 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文章来源地址https://www.toymoban.com/news/detail-707936.html

到了这里,关于.Net Framework使用Autofac实现依赖注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。 并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多

    2024年02月06日
    浏览(63)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(45)
  • net6 winform使用依赖注入(IOC)

    依赖注入(DI)是一种设计模式,它可以消除编程代码之间的依赖性,因此可以很容易地管理和测试应用程序。它有三种类型分别为构造函数注入,属性注入以及方法注入。它具有减少依赖性增强组件的可重用性等好处。 通俗的来说我们不通过 new 的方式在类内部创建依赖类

    2024年02月05日
    浏览(47)
  • 【微软技术栈】C#.NET 中使用依赖注入

    先决条件 创建新的控制台应用程序 添加接口 添加默认实现 添加需要 DI 的服务 为 DI 注册服务 结束语 本文介绍如何在 .NET 中使用依赖注入 (DI)。 借助 Microsoft 扩展,可通过添加服务并在 IServiceCollection 中配置这些服务来管理 DI。 IHost 接口会公开 IServiceProvider 实例,它充

    2024年02月04日
    浏览(37)
  • 【ASP.NET Core 基础知识】--依赖注入(DI)--什么是依赖注入

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦和管理类之间的依赖关系。它的核心思想是将原本需要在代码中显式创建的依赖关系,交给外部容器进行控制和管理。 具体来说,依赖注入的实现方式是通过将依赖对象的创建和维护责任转移到外部容器中,使

    2024年01月23日
    浏览(64)
  • .NET Core 依赖注入

    在.NET Core中,依赖注入(Dependency Injection,简称DI)是框架的一个重要特性,可以帮助我们解耦代码、管理对象生命周期以及提高可测试性等.一下是.NET Core中依赖注入的一些基本概念和用法: 1、服务(Service):在DI中,服务即一个对象或者类型。用于完成特定的功能.例如,数据库访

    2023年04月24日
    浏览(44)
  • .Net依赖注入神器Scrutor(上)

    从.Net Core 开始,.Net 平台内置了一个轻量,易用的 IOC 的框架,供我们在应用程序中使用,社区内还有很多强大的第三方的依赖注入框架如: Autofac DryIOC Grace LightInject Lamar Stashbox Simple Injector 内置的依赖注入容器基本可以满足大多数应用的需求,除非你需要的特定功能不受它支

    2024年03月19日
    浏览(44)
  • .NET 通过源码深究依赖注入原理

    依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。 Singleton服务为什么不能依赖Scoped服务? 多个构造函数的选择机制? 源码是如何识别循环

    2024年02月05日
    浏览(64)
  • 使用 Spring 实现控制反转和依赖注入

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月13日
    浏览(35)
  • ASP.NET WebApi 极简依赖注入

    .NET Core 7.0 ASP.NET Core Visual Studio 2022 .Net Core WebApi Redis消息订阅 ASP.NET Core 依赖注入最佳实践 简单来说就是 有效地设计服务及其依赖关系。 防止多线程问题。 防止内存泄漏。 防止潜在的错误。

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包