Asp.Net Core WebAPI 使用依赖注入DI

cs 复制代码
namespace WebAPI_DI
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

builder.Services 则是帮我已经创建好的IServiceCollection 对象。

我们再新建一个测试类 DITestClass:

public class DITestClass { public int Add(int i, int n) { return i + n; } }

然后我们在builder.Services中进行注册

最后我们在默认的WeatherForecastController控制器里面加一个post方法,并用构造函数注入的方式将DITestClass注入进去。

二、[FromService] 注入

FromServicesAttribute 允许将服务直接注入到操作方法,而无需使用构造函数注入。

改属性的作用主要针对我们在依赖注入初始化对象(该对象初始化很耗时),这个时候不管请求的api方法有没有用到该对象都会等待很长时间。

所以使用FromService让接口在请求的时候再注入,从而不影响其他接口

三、多层架构注入

在多层架构中我们如果引用了其他项目,要使用其他项目中的类,那么要在主项目中进行DI注入,这样相当于所有其他模块或者其他人写的项目都需要主项目来维护注入,比如:

新建一个ClassLibrary1项目,Class1类,方法Sub:

那么有没有方法让他们自己的项目自己管理注册呢,我们可以简单改造一下

  • 新建一个类库,定义一个公共接口,安装Microsoft.Extensions.DependencyInjection
  • 在ClassLibarary1里面定义实现接口类
  • 在Programe.cs里面调用引用项目的注册类

这样其他项目也按照这种方式,在主项目中只要调用一次注册管理。不过这是最简单的方式,你也可以使用反射来查找引用的项目继承了IModuleInit的类,然后进行Init方法调用,这样会更优雅一些。

当然你还可以使用其他依赖注入框架来取代Microsoft.Extensions.DependencyInjection,也许这个问题就不再是问题!

相关推荐
IT_陈寒1 小时前
SpringBoot 3.2新特性实战:这5个隐藏技巧让你的启动速度提升50%
前端·人工智能·后端
阿杆1 小时前
国产神级开源 OCR 模型,GitHub 55k Star!再次起飞!
后端·github·图像识别
武子康1 小时前
大数据-102 Spark Streaming 与 Kafka 集成全解析:Receiver 与 Direct 两种方式详解 附代码案例
大数据·后端·spark
生无谓1 小时前
spring.factories作用
后端
Focusbe1 小时前
为什么 “大前端” 需要 “微前端”?
前端·后端·架构
考虑考虑2 小时前
Optional中的flatMap使用
后端
张高培是我的爸爸2 小时前
DevOps 核心工具:深入浅出 Jenkins 自动化与实践
后端
王道长AWS_服务器2 小时前
AWS 的存储方案全对比:EBS、S3、EFS 用在哪?
后端·aws
用户4099322502122 小时前
能当关系型数据库还能玩对象特性,能拆复杂查询还能自动管库存,PostgreSQL 凭什么这么香?
后端·ai编程·trae
生无谓2 小时前
拦截器和过滤器的区别
后端