前言
嘿,小伙伴们,今天我们来一场 Autofac 的学习之旅吧!
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 “魔法师”,用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护。
说到 Autofac 的强大之处,灵活性和扩展性简直无敌!不管你的依赖关系有多复杂,Autofac 都会让它们有序而美观地排列起来,犹如一场华丽的交响乐。
准备好了吗?让我们首先通过一个的 Step By Step 例子来感受 Autofac 的魅力和乐趣吧!
Step By Step 步骤
- 创建一个 ASP.NET WebApi 项目,如 AutofacSample
- 安装以下 Autofac NuGet 包- Autofac- Autofac.WebApi2
- 创建一个简单的服务接口和它的实现,后面要用到它们- IGreeter.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceAutofacSample.Services{/// <summary>/// 创建一个简单的服务接口/// </summary>publicinterfaceIGreeter{stringGreet(string name);}}
- GreeterImpl.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceAutofacSample.Services{publicclassGreeterImpl:IGreeter{publicstringGreet(string name){return$"Hello, {name}! Welcome to Autofac world!";}}}
- 在
App_Start
目录下,新建一个名为AutofacConfig.cs
的类文件(重点,留意注释)usingAutofac;usingAutofac.Integration.WebApi;usingAutofacSample.Services;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Web;usingSystem.Web.Http;usingSystem.Web.Mvc;namespaceAutofacSample.App_Start{/// <summary>/// Autofac 配置类/// </summary>publicclassAutofacConfig{/// <summary>/// 依赖注入配置/// </summary>publicstaticvoidRegisterConfig(){// 创建一个容器var builder =newContainerBuilder();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 =newAutofacWebApiDependencyResolver(container);}}}
- 打开
Global.asax.cs
文件在Application_Start
事件中注册protectedvoidApplication_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步创建的服务接口
usingAutofacSample.Services;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Http;usingSystem.Web.Http;namespaceAutofacSample.Controllers{[RoutePrefix("api/Greeting")]publicclassGreetingController:ApiController{privatereadonlyIGreeter _greeter;/// <summary>/// 通过构造方法注入 IGreeter/// </summary>/// <param name="greeter"></param>publicGreetingController(IGreeter greeter){ _greeter = greeter;}[HttpGet][Route("greet")]publicIHttpActionResultGreet(string name){var message = _greeter.Greet(name);returnOk(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 了,你可以在官网解锁更多的使用姿势,比如属性注入、方法注入等。通过依赖注入,你能更灵活地管理服务和控制器之间的关系,写出更干净、可维护的代码,同时享受更多编程的乐趣!
往期精彩
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号,相互交流,共同进步!
版权归原作者 代码掌控者 所有, 如有侵权,请联系我们删除。