前言
嘿,小伙伴们,今天我们来一场 Autofac 的学习之旅吧!
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 “魔法师”,用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护。
说到 Autofac 的强大之处,灵活性和扩展性简直无敌!不管你的依赖关系有多复杂,Autofac 都会让它们有序而美观地排列起来,犹如一场华丽的交响乐。
准备好了吗?让我们首先通过一个的 Step By Step 例子来感受 Autofac 的魅力和乐趣吧!
Step By Step 步骤
-
创建一个 ASP.NET WebApi 项目,如 AutofacSample
-
安装以下 Autofac NuGet 包
- Autofac
- Autofac.WebApi2
-
创建一个简单的服务接口和它的实现,后面要用到它们
-
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!"; } } }
-
-
在
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); } } }
-
打开
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); }
-
创建一个 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); } } }
-
测试
运行项目,打开 Postman,访问以下链接:
http://localhost:端口/api/Greeting/greet?name=你的名字,如: http://localhost:44340/api/Greeting/greet?name=Jacky
你应该会看到一条非常友好的问候消息,如下图,这样就说明你的 Autofac 已经配置成功啦!
Autofac 的优势
你感受到 Autofac 魅力了吗?不需要 new
就自动创建了一个对象,并且自动管理对象的生命周期!
总结一下 Autofac 的优点:
-
灵活性高:支持属性注入、构造函数注入和方法注入,就像一个多用途工具箱,满足各种依赖注入需求。
-
生命周期管理:帮助你管理对象的生命周期,比如单例、瞬态等等,这样你就可以轻松地控制每个对象的生命历程,犹如一个神秘的时光操控者。
-
易于上手:文档丰富,社区活跃,适合初学者快速上手。
-
强大的扩展性:结合反射技术,可以自动扫描并注册程序集中的服务接口,一行代码,轻松搞定已有和新增加的服务!
-
性能优秀: 在处理依赖注入时表现得相当高效。
注意事项
没有不好用的技术,只有用不好的程序员,虽然 Autofac 有这么多的优势,但在使用过程中也要注意一些事项:
-
确保安装了与项目版本兼容的 Autofac 相关的 NuGet 包
-
过度使用依赖注入,或者在不需要的地方引入它,可能导致系统变得过于复杂,尽量在大型项目或复杂应用中使用 Autofac
-
确保 Autofac 容器配置正确,错误的注册可能会在运行时引发异常,给调试带来困扰。
-
尽管 Autofac 性能优秀,但大量使用反射可能会带来性能开销
总结
恭喜你!你现在已经知道如何在 ASP.NET WebApi 使用 Autofac 了,你可以在官网解锁更多的使用姿势,比如属性注入、方法注入等。通过依赖注入,你能更灵活地管理服务和控制器之间的关系,写出更干净、可维护的代码,同时享受更多编程的乐趣!
往期精彩
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!