首页 > 其他分享 >.Net Framework使用Autofac实现依赖注入

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

时间:2023-09-12 12:55:08浏览次数:46  
标签:Autofac builder dbContext Framework 实例 注册 Net public

.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,builder,dbContext,Framework,实例,注册,Net,public
From: https://www.cnblogs.com/ZYPLJ/p/17694895.html

相关文章

  • kubernetes部署mongoDB 单机版 自定义配置文件、密码、日志路径等
    来源:https://aijishu.com/a/1060000000097166官方镜像地址: https://hub.docker.com/_/mong...docker版的mongo移除了默认的/etc/mongo.conf,修改了db数据存储路径为/data/db.创建configmap配置,注意不能加fork=true,否则Pod会变成Completed。apiVersion:v1kind:ConfigMap......
  • 在.NET中实现事件驱动编程模式
    当在.NET中实现事件驱动编程模式时,你可以创建自定义事件和委托,然后让对象触发事件,以便其他对象可以订阅并响应这些事件。这种模式常用于构建可扩展和松散耦合的应用程序。以下是一个基本示例,演示如何在C#中实现事件驱动编程。步骤1:创建一个C#控制台应用程序首先,创建一个新的C#控......
  • 使用ML.NET进行机器学习和数据挖掘
    当使用ML.NET进行机器学习和数据挖掘时,你可以创建自己的机器学习模型,用它来做预测或者数据挖掘任务。在这篇博客中,我将向你展示如何使用ML.NET来创建一个简单的分类模型,用于预测鸢尾花数据集中的花朵种类。我们将使用C#编写代码。步骤1:准备工作首先,确保你已经安装了.NETCore和ML......
  • static nat(network address translate)
    核心1、出接口配置natstatic转换,命令如下interfaceGigabitEthernet0/0/1ipaddress20.1.1.1255.255.255.0 natstaticglobal20.1.1.3inside10.1.1.2netmask255.255.255.255natstaticglobal20.1.1.4inside10.1.1.3netmask255.255.255.255注意:此种转换方式......
  • .NET中测量多线程基准性能
    多线程基准性能是用来衡量计算机系统或应用程序在多线程环境下的执行能力和性能的度量指标。它通常用来评估系统在并行处理任务时的效率和性能。测量中通常创建多个线程并在这些线程上执行并发任务,以模拟实际应用程序的并行处理需求。在此,我们用多个线程来完成一个计数任务,简单地......
  • log4net性能小探
    初步测试了Log4性能。Appender架构如下。一般客户端,使用FileAppender,把Log记录在本地磁盘。<lockingModeltype="log4net.Appender.FileAppender+InterProcessLock"/> lockingModel影响性能。有三种模式:ExclusiveLock,MinimalLock,InterProcessLock。默认是ExclusiveLock,此......
  • liunx部署.net core
    将Microsoft包签名密钥添加到受信任密钥列表,并添加Microsoft包存储库sudorpm-Uvhhttps://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm安装SDKsudoyuminstalldotnet-sdk-6.0安装ASP.NETCore运行时sudoyuminstallaspnetcore-run......
  • 如何像 Sealos 一样在浏览器中打造一个 Kubernetes 终端?
    作者:槐佳辉。Sealosmaintainer在Kubernetes的世界中,命令行工具(如kubectl和helm)是我们与集群交互的主要方式。然而,有时候,我们可能希望能够在Web页面中直接打开一个终端,执行这些命令,而不需要在本地环境中安装和配置这些工具。本文将深入探讨如何通过Kubernetes自定义资......
  • ubuntu22.04在线安装.net6SDK
    运行以下命令,查找下载对应包文件sudoaptupdate&&sudoaptinstalldotnet6如果只想安装部分组件,命令如下://仅安装特定组件sudoaptinstalldotnet-sdk-6.0sudoaptinstalldotnet-runtime-6.Osudoaptinstallaspnetcore-runtime-6.0 但是运行命令后......
  • 关于Kubernetes-v1.23-pod-生命周期-postStart-preStop-terminationGracePeriodSecond
    我们在一个pod的yaml配置文件中,有时会看到,terminationGracePeriodSeconds选项,与containers:同级,一般可以放于spec:下面即可是当pod,变为删除的状态后,会给pod一个宽限期,让pod去执行一些清理或者销毁操作另外还有两个选项,postStart,preStop,这两个是位于lifecycle,属于pod生命周期......