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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值