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

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

Coding-89.png

前言

嘿,小伙伴们,今天我们来一场 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 已经配置成功啦!
    Coding-88.png

Autofac 的优势

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

总结一下 Autofac 的优点:

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

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

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

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

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

注意事项

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

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

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

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

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

总结

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

往期精彩

  1. C# 静态类,高手不想让你知道的 15 个真相
  2. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  3. 用 C# Stopwatch 计时,让代码性能飞起来!
  4. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  5. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  6. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  7. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  8. C# AutoMapper 10个常用方法总结
  9. C# 7个方法比较两个对象是否相等
  10. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得。欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来!

相关文章
|
22天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
39 5
|
3月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
308 3
|
4月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
5月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
66 0
|
5月前
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
|
5天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
4月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
51 7
|
4月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
85 0
|
5月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
5月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
155 0