驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结

news2024/9/23 13:30:36

image

前言

嘿,小伙伴们,今天我们来一场 Autofac 的学习之旅吧!

Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 “魔法师”,用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护。

说到 Autofac 的强大之处,灵活性和扩展性简直无敌!不管你的依赖关系有多复杂,Autofac 都会让它们有序而美观地排列起来,犹如一场华丽的交响乐。

准备好了吗?让我们首先通过一个的 Step By Step 例子来感受 Autofac 的魅力和乐趣吧!

Step By Step 步骤

  1. 创建一个 ASP.NET WebApi 项目,如 AutofacSample

  2. 安装以下 Autofac NuGet 包

    • Autofac
    • Autofac.WebApi2
  3. 创建一个简单的服务接口和它的实现,后面要用到它们

    • IGreeter.cs

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace AutofacSample.Services
      {
      	/// <summary>
      	/// 创建一个简单的服务接口
      	/// </summary>
      	public interface IGreeter
      	{
      		string Greet(string name);
      	}
      }
      
    • GreeterImpl.cs

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      
      namespace AutofacSample.Services
      {
      	public class GreeterImpl : IGreeter
      	{
      		public string Greet(string name)
      		{
      			return $"Hello, {name}! Welcome to Autofac world!";
      		}
      	}
      }
      
  4. App_Start 目录下,新建一个名为 AutofacConfig.cs 的类文件(重点,留意注释

    using Autofac;
    using Autofac.Integration.WebApi;
    using AutofacSample.Services;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Http;
    using System.Web.Mvc;
    
    namespace AutofacSample.App_Start
    {
    	/// <summary>
    	/// Autofac 配置类
    	/// </summary>
    	public class AutofacConfig
    	{
    		/// <summary>
    		/// 依赖注入配置
    		/// </summary>
    		public static void RegisterConfig()
    		{
    			// 创建一个容器
    			var builder = new ContainerBuilder();
    			HttpConfiguration config = GlobalConfiguration.Configuration;
    
    			// 注册业务服务,即接口
    			// 注册时,可以选择三种生命周期
    			// InstancePerDependency:每次请求都会创建新的实例,这是默认的生命周期
    			// SingleInstance:单例模式,整个应用程序生命周期内只创建一个实例
    			// InstancePerLifetimeScope:在一个生命周期范围内创建一个实例,这个范围可以是容器、子容器或者命名的子容器
    			// InstancePerMatchingLifetimeScope:在匹配的生命周期范围内创建实例,必须是父子容器或命名容器之间的匹配
    			// InstancePerHttpRequest:在一个HTTP请求内创建一个实例,仅适用于ASP.NET环境
    			builder.RegisterType<GreeterImpl>().As<IGreeter>().InstancePerDependency();
    			
    			// 上面为了演示,手动注册一个服务,实际开发时,可以使用反射将要注册的服务统一注册,代码逻辑更加简洁,如下
    			// builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
    
    			// 注册 API 控制器
    			builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    			var container = builder.Build();
    
    			// 设置 Web API 的解析器
    			config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    		}
    	}
    }
    
  5. 打开 Global.asax.cs 文件在 Application_Start 事件中注册

    protected void Application_Start()
    {
    	//autofac注册
    	AutofacConfig.RegisterConfig();
    
    	AreaRegistration.RegisterAllAreas();
    	GlobalConfiguration.Configure(WebApiConfig.Register);
    	FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    	RouteConfig.RegisterRoutes(RouteTable.Routes);
    	BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    
  6. 创建一个 API 控制器如 GreetingController.cs 来使用第3步创建的服务接口

    using AutofacSample.Services;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace AutofacSample.Controllers
    {
    	[RoutePrefix("api/Greeting")]
    	public class GreetingController : ApiController
    	{
    		private readonly IGreeter _greeter;
    
    		/// <summary>
    		/// 通过构造方法注入 IGreeter
    		/// </summary>
    		/// <param name="greeter"></param>
    		public GreetingController(IGreeter greeter)
    		{
    			_greeter = greeter;
    		}
    
    		[HttpGet]
    		[Route("greet")]
    		public IHttpActionResult Greet(string name)
    		{
    			var message = _greeter.Greet(name);
    			return Ok(message);
    		}
    	}
    }
    
  7. 测试

    运行项目,打开 Postman,访问以下链接:

    http://localhost:端口/api/Greeting/greet?name=你的名字,如:
    http://localhost:44340/api/Greeting/greet?name=Jacky
    

    你应该会看到一条非常友好的问候消息,如下图,这样就说明你的 Autofac 已经配置成功啦!
    image

Autofac 的优势

你感受到 Autofac 魅力了吗?不需要 new 就自动创建了一个对象,并且自动管理对象的生命周期!

总结一下 Autofac 的优点:

  • 灵活性高:支持属性注入、构造函数注入和方法注入,就像一个多用途工具箱,满足各种依赖注入需求。

  • 生命周期管理:帮助你管理对象的生命周期,比如单例、瞬态等等,这样你就可以轻松地控制每个对象的生命历程,犹如一个神秘的时光操控者。

  • 易于上手:文档丰富,社区活跃,适合初学者快速上手。

  • 强大的扩展性:结合反射技术,可以自动扫描并注册程序集中的服务接口,一行代码,轻松搞定已有和新增加的服务!

  • 性能优秀: 在处理依赖注入时表现得相当高效。

注意事项

没有不好用的技术,只有用不好的程序员,虽然 Autofac 有这么多的优势,但在使用过程中也要注意一些事项:

  1. 确保安装了与项目版本兼容的 Autofac 相关的 NuGet 包

  2. 过度使用依赖注入,或者在不需要的地方引入它,可能导致系统变得过于复杂,尽量在大型项目或复杂应用中使用 Autofac

  3. 确保 Autofac 容器配置正确,错误的注册可能会在运行时引发异常,给调试带来困扰。

  4. 尽管 Autofac 性能优秀,但大量使用反射可能会带来性能开销

总结

恭喜你!你现在已经知道如何在 ASP.NET WebApi 使用 Autofac 了,你可以在官网解锁更多的使用姿势,比如属性注入、方法注入等。通过依赖注入,你能更灵活地管理服务和控制器之间的关系,写出更干净、可维护的代码,同时享受更多编程的乐趣!

往期精彩

  1. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  2. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库

828华为云征文&#xff5c;华为云Flexus X实例docker部署最新gitlab社区版&#xff0c;搭建自己的私人代码仓库 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Ng…

大数据采集迁移工具

Flume Sqoop kafka框架 MQ&#xff1a;消息队列 broker相当于服务器 消息队列

栈和队列(1)

空栈先移动栈顶再加数据&#xff0c;满栈先插入数据再移 栈的基本概念栈是一种后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的数据结构。栈支持两种主要的操作&#xff1a;•压栈&#xff08;Push&#xff09;&#xff1a;向栈中添加一个元素。•弹栈&…

Kubernetes v1.28.0安装详解

Kubernetes v1.28.0安装详解 一.环境初始化 要在所有节点执行命令进行配置 1、检查操作系统的版本 此部署环境为CentOS 7.9 [rootCentOS7 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootCentOS7 ~]#2、主机名解析 为了方便集群节点间的互相调…

活动系统开发之采用设计模式与非设计模式的区别-数据库设计及代码设计

1、数据库ER图 2、应用框架选用 PHP语言对应的thinkphp6.1应用框架 3、功能代码设计(后端) a、父类Base.php i&#xff1a;控制登录&#xff0c;只能登录后管理员才能操作&#xff1b; ii&#xff1a;控制按钮权限&#xff0c;管理员不仅要登录&#xff0c;且必须要有对应菜单…

报错处理:超过Uobject最大数量

处理方式 一、打包时项目中设置游戏中UObject的最大数量为100000000 二、打包后的配置文件中设置 打包路径&#xff1a; 一厅统管\Windows\YZ_YTTG\Saved\Config\Windows\Engine.ini文件下添加配置文件 [/Script/Engine.GarbageCollectionSettings] gc.MaxObjectsInEditor1000…

API 网关 OpenID Connect 实战:单点登录(SSO)如此简单

作者&#xff1a;戴靖泽&#xff0c;阿里云 API 网关研发&#xff0c;Higress 开源社区 Member 前言 随着企业的发展&#xff0c;所使用的系统数量逐渐增多&#xff0c;用户在使用不同系统时需要频繁登录&#xff0c;导致用户体验较差。单点登录&#xff08;Single Sign-On&a…

2024最新!Facebook手机版和网页版改名教程!

Facebook作为全球最大的社交平台之一&#xff0c;允许用户自定义名字和昵称。在Facebook更新姓名可以帮助您更好的展现账号形象。本文将为您提供详细的步骤指导&#xff0c;帮助您在手机APP和网页版上轻松完成Facebook改名操作。 Facebook手机版改名 打开Facebook APP并登录账号…

区块链ARC如何能让节点能够大规模处理交易数据

​​发表时间&#xff1a;2024年8月7日 TAAL技术主管Michael Bckli表示&#xff0c;TAAL公司一直在对ARC进行测试&#xff0c;并准备在今年年底全面发布。因TAAL在区块链交易处理方面具备深厚的专业知识&#xff0c;BSV区块链委托TAAL进行ARC开源参考落地方案的开发。 ARC是一个…

魔珐科技受邀参与外滩大会:以3D数字人AIGC产品赋能大资管行业,重塑金融服务边界

在人工智能浪潮的推动下&#xff0c;金融行业正经历着前所未有的场景革命。2024年Inclusion外滩大会作为行业交流的盛会&#xff0c;汇聚了众多学者、专家及企业领袖&#xff0c;共同探讨AI技术在多领域的深度应用&#xff0c;特别是其在金融行业中的革新潜力。 在外滩大会上&…

在桌面商业分析应用程序中启用高级 Web UI

挑战 Mercur Business Control 应用程序在企业界&#xff0c;尤其是金融领域&#xff0c;拥有悠久的应用历史。它帮助企业处理、可视化和分析海量数据&#xff0c;从而做出明智的商业决策。 随着产品的不断演进和现代化&#xff0c;Mercur Solutions AB 为该应用创建了 Web 客…

使用RestTemplate获取国内大盘股票数据的基本信息并存入数据库中

目录 使用RestTemplate获取国内大盘股票数据的基本信息并存入数据库中 第一步&#xff1a;导入RestTemplate依赖&#xff0c;并配置RestTemplate让其加入到SpringIoC容器中 第二步&#xff1a;在yml文件定义股票的相关参数 第三步&#xff1a;向新浪网发送请求&#xff0c;获…

FP7195:非同步升压恒流LED区动IC

前言&#xff1a;LED驱动芯片是什么&#xff1f; LED驱动芯片是一种能够将电源的电压和电流转换为适合LED&#xff08;发光二极管&#xff09;使用的电压和电流的芯片。这种芯片的主要作用是控制LED的亮度和电流&#xff0c;从而保证LED的正常工作和长寿命。简单来说&#xff…

【C++二分查找】1802. 有界数组中指定下标处的最大值

本文涉及的基础知识点 C二分查找 LeetCode 1802. 有界数组中指定下标处的最大值 给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length n nums[i] 是 正整数 &#xf…

Vue组件:使用$emit()方法监听子组件事件

1、监听自定义事件 父组件通过使用 Prop 为子组件传递数据&#xff0c;但如果子组件要把数据传递回去&#xff0c;就需要使用自定义事件来实现。父组件可以通过 v-on 指令&#xff08;简写形式“”&#xff09;监听子组件实例的自定义事件&#xff0c;而子组件可以通过调用内建…

Ollama Qwen2 支持 Function Calling

默认 Ollama 中的 Qwen2 模型不支持 Function Calling&#xff0c;使用默认 Qwen2&#xff0c;Ollama 会报错。本文将根据官方模板对 ChatTemplate 进行改进&#xff0c;使得Qwen2 支持 Tools&#xff0c;支持函数调用。 Ollama 会检查对话模板中是否存在 Tools&#xff0c;如…

wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法

在遇到各种系统文件错误当中&#xff0c;其中之一就是“wlanapi.dll文件丢失”的问题。这种问题通常发生在Windows操作系统上&#xff0c;特别是当系统试图执行与无线网络相关的任务时。wlanapi.dll是一个重要的系统文件&#xff0c;它负责处理Windows无线网络服务的许多功能。…

一种非接触式智能垃圾桶设计(论文+源码+实物)

1系统方案设计 通过对需求展开分析&#xff0c;本设计非接触式智能垃圾桶采用STM32F103单片机作为控制器&#xff0c;通过红外传感器实现垃圾桶的满溢检测&#xff0c;通过三个SG90舵机分别控制可回收、不可回收、其他垃圾桶盖的开关&#xff0c;并通过WiFi通信模块将数据信息…

Windows编译Hikari-LLVM15[llvm-18.1.8rel]并集成到Android Studio NDK

Windows编译Hikari-LLVM15[llvm-18.1.8rel]并集成到Android Studio NDK 工具1、w64devkit2、ndk3、cmake 编译1、准备工作2、开始编译 集成1、替换文件2、使用 工具 1、w64devkit w64devkit 解压出来给个环境变量 验证一下 2、ndk 通过android studio安装 ndk\27.1.1229…

PaddleOCR基础入门

1、下载paddle源码 https://github.com/PaddlePaddle/PaddleOCR2、新建conda虚拟环境 conda create --name paddleocr_env python3.103、激活conda虚拟环境 conda activate paddleocr_env4、解压paddleOCR并进入ocr目录&#xff0c;运行安装所需库&#xff1a; pip install…