• .net 温故知新【13】:Asp.Net Core WebAPI 使用依赖注入DI


    一、使用DI注入

    在之前的文章中已经讲过DI的概念(.net 温故知新:【7】IOC控制反转,DI依赖注入),基于控制台程序演示了DI依赖注入的使用,基于Microsoft.Extensions.DependencyInjection完成。那在WebAPI中如何使用依赖注入呢?

    首先新建一个WebAPI项目WebAPI_DI,框架.net 7,其实 webapi 项目也是控制台应用程序,只是在Asp.Net Core webapi框架中很多基础工作已经帮我们封装配置好了。

    项目新建完成后在Program.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中进行注册

    image

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

    image

    swagger中调用测试:

    image

    二、[FromService] 注入

    FromServicesAttribute 允许将服务直接注入到操作方法,而无需使用构造函数注入。
    改属性的作用主要针对我们在依赖注入初始化对象(该对象初始化很耗时),这个时候不管请求的api方法有没有用到该对象都会等待很长时间。
    所以使用FromService让接口在请求的时候再注入,从而不影响其他接口

    image

    三、多层架构注入

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

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

    image

    我们在web项目里面引用ClassLibrary1项目,如果要使用Class1类就需要在 Programe.cs里面注册

    builder.Services.AddScoped(typeof(Class1));

    image

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

    • 新建一个类库,定义一个公共接口,安装Microsoft.Extensions.DependencyInjection

    image

    • 在ClassLibarary1里面定义实现接口类
        public class ModulInit : IModuleInit
        {
            public void Init(IServiceCollection service)
            {
                //所有需要DI的在此处注入
                service.AddScoped();
            }
        }
    
    • 在Programe.cs里面调用引用项目的注册类

    image

    这样其他项目也按照这种方式,在主项目中只要调用一次注册管理。不过这是最简单的方式,你也可以使用反射来查找引用的项目继承了IModuleInit的类,然后进行Init方法调用,这样会更优雅一些。
    当然你还可以使用其他依赖注入框架来取代Microsoft.Extensions.DependencyInjection,也学这个问题就不再是问题!

  • 相关阅读:
    C++继承、多态与虚函数(二)
    【Harmony OS】【ARK UI】ets实现文件读写操作
    C语言——联合与枚举
    vite打包vue2 history路由模式的的项目部署线上后<router-view />页面显示空白,命令行也不报错,本地是没有问题的
    主应用窗口
    LeetCode1137第N个泰波那契数
    性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务
    idea的debug调试
    SpringBoot @InitBinder注解实现Bean国际化校验
    死锁(什么是死锁、怎样预防死锁、避免死锁、检测和解除)
  • 原文地址:https://www.cnblogs.com/SunSpring/p/17816564.html