ASP.NET Core 使用Autofac

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: ASP.NET Core 使用Autofac

ASP.NET Core 使用Autofac

  1. 安装Autofac 和 Autofac.Extensions.DependencyInjection nuget包
  2. 修改 Program 类

         public static IHostBuilder CreateHostBuilder(string[] args) =>
             Host.CreateDefaultBuilder(args)
                 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                 .ConfigureWebHostDefaults(webBuilder =>
                 {
         
         
                     webBuilder.UseStartup<Startup>();
                 });
    
  3. 修改 Startup 类,在该类中添加 ConfigureContainer 方法

属性介绍:
RegisterAssemblyTypes:寄存器程序集类型
AsImplementedInterfaces:实现的接口
InstancePerDependency:实例依赖关系
PropertiesAutowired:属性自动连接(属性自动注入)

        /// <summary>
        /// 配置Autofac容器替换微软的DI
        /// </summary>
        /// <param name="containerBuilder"></param>
        public void ConfigureContainer(ContainerBuilder builder)
        {
   
   
            // 单个服务类注册
            builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();

            // 多个服务类,也就是程序集注册 //
            // 这是注册其他项目的程序集服务
            var basePath = AppContext.BaseDirectory;
            //DALService所在程序集命名空间
            string DALPath = Path.Combine(basePath, "GraduationProject.DAL.dll");
            Assembly DAL = Assembly.LoadFrom(DALPath);
            //BLLService所在程序集命名空间
            string BLLPath = Path.Combine(basePath, "GraduationProject.BLL.dll");
            Assembly BLL = Assembly.LoadFrom(BLLPath);
            builder.RegisterAssemblyTypes(DAL).InstancePerDependency().PropertiesAutowired();
            builder.RegisterAssemblyTypes(BLL).AsImplementedInterfaces().InstancePerDependency().PropertiesAutowired();

            // 这是注册同一项目下的程序集服务
            builder.RegisterAssemblyTypes(typeof(Program).Assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
        }

或者新建AutofacModelRegister 配置类

// 继承自 Autofac.Model    
public class AutofacModelRegister : Autofac.Module
    {
   
   
      //重写Autofac管道Load方法,在这里注册注入
     protected override void Load(ContainerBuilder builder)
     {
   
   
         // 配置逻辑同上
         builder.RegisterType<UserService>().As<IUserService>();
    }
}
// 然后在startup类中新建ConfigureContainer方法,配置
public void ConfigureContainer(ContainerBuilder builder)
{
   
   
    // 直接用Autofac注册我们自定义的 
    builder.RegisterModule(new AutofacModuleRegister());
    // 服务项目程序集
    //Assembly service = Assembly.Load("XXX.Service");
    // 服务接口项目程序集
    //Assembly iservice = Assembly.Load("XXX.IService");
    //builder.RegisterAssemblyTypes(service, iservice).Where(t => t.FullName.EndsWith("Service") && !t.IsAbstract)
    //.InstancePerLifetimeScope()
    //.AsImplementedInterfaces();
}

注意:如果需要注入的服务没有 interface ,那么 builder.RegisterAssemblyTypes 就只需要传一个程序集就OK了。如果服务与接口同在一个项目,那也是要传两个程序集的哦。

  1. controller 中使用

     [ApiController]
     [Route("[controller]")]
     public class HomeController : ControllerBase
     {
         
         
         private readonly IUserService _userService;
    
         public HomeController(IUserService userService)
         {
         
         
             _userService = userService;
         }
         [HttpGet]
         public IActionResult Index()
         {
         
         
             return Ok(_userService.GetName("Test"));
         }
     }
    

    属性自动注入

    默认支持构造函数注入,如果需要属性注入,对比构造函数注入,属性注入就多追加了 PropertiesAutowired() 函数
    image.png

注意:属性注入记得将属性的访问修饰符改为注册类可访问的修饰符,否则会注入失败。
image.png

如果不是public 则会抛出空引用。
原因大概就是 Controller 是由 Mvc 模块管理的,不在 IOC 容器内,所以在 Controller 中无法使用 Autofac 注入的实例。

// 解决上面的问题,在 Startup 的 ConfigureServices 方法底部加入如下代码:
// 使用 ServiceBasedControllerActivator 替换 DefaultControllerActivator; // Controller 默认是由 Mvc 模块管理的,不在 Ioc 容器中。替换之后,将放在 Ioc 容器中。 
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
// 然后回到我们的 AutofacModuleRegister 注入 Controller:
builder.RegisterTypes(GetAssemblyTypes<Startup>(type => typeof(ControllerBase).IsAssignableFrom(type)))                 .PropertiesAutowired();
目录
相关文章
|
1月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
223 6
|
11月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
293 5
|
11月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
265 1
|
11月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
327 3
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
移动开发 中间件 .NET
ASP.NET Core 2 学习笔记(三)中间件
原文:ASP.NET Core 2 学习笔记(三)中间件 之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middleware。
1067 54
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
329 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
341 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师