当前位置: 首页 > article >正文

.NET Core 中依赖注入的使用

ASP.NET Core中服务注入的地方

  1. 在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builder.Services中注入。
  2. 在Controller中可以通过构造方法注入服务。

低使用频率的服务

  1. 把Action用到的服务通过Action的参数注入,在这个参数上标注[FromServices]。和Action的其他参数不冲突。
  2. 一般不需要,只有调用频率不高并且资源的创建比较消耗资源的服务才[FromServices]。
  3. 只有Action方法才能用[FromServices] ,普通的类默认不支持。
public class student
{
    public int add(int a, int b)
    {
        return a + b;
    }
}

program:
builder.Services.AddScoped<student>();

[Route("api/[controller]/[action]")]
[ApiController]
public class LoginController : ControllerBase
{
    private readonly student students;

    public LoginController(student students)
    {
        this.students = students;
    }

    [HttpGet]
    public int abc(int id)
    {
        return new student().add(1, 2);
    }
}

开发模块化的服务注册框架

在分层项目中,让各个项目负责各自的服务注册。

  1. Install-Package Zack.Commons
  2. 每个项目中创建一个或者多个实现了IModuleInitializer接口的类。
  3. 在Program.cs初始化DI容器

var assemblies = ReflectionHelper.GetAllReferencedAssemblies();
builder.services.RunModuleInitializers(assemblies);
 

namespace ClassLibrary1
{
    public class Class1
    {
        public int Hello()
        {
            return 1;
        }
    }
}

namespace ClassLibrary1
{
    internal class ModuleInitializer : IModuleInitializer
    {
        public void Initialize(IServiceCollection services)
        {
            services.AddScoped<Class1>();
        }
    }
}

namespace WebApplication2.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        private readonly Class1 class1;
        private readonly Class2 class2;

        public PersonController(Class1 class1, Class2 class2)
        {
            this.class1 = class1;
            this.class2 = class2;
        }

        [HttpGet]
        public int Hello()
        {
            return class1.Hello();
        }
    }
}

//Program添加
//获取所有的用户程序集
var assemblies = ReflectionHelper.GetAllReferencedAssemblies();
//扫描指定程序集中所有实现了IModuleInitializer接口的类,并调用Initialize方法完成服务注册
builder.Services.RunModuleInitializers(assemblies);


http://www.kler.cn/a/521829.html

相关文章:

  • 【张雪峰高考志愿填报】合集
  • C++并发编程指南05
  • 【go语言】结构体
  • 网络工程师 (7)进程管理
  • QT 通过ODBC连接数据库的好方法:
  • C++ unordered_map和unordered_set的使用,哈希表的实现
  • 上位机知识篇---CMake
  • download-git-repo 一款命令行下载仓库依赖
  • DeepSeek崛起:中国AI新星如何撼动全球资本市场格局
  • PHP中的获取器和修改器:探索数据访问的新维度
  • H3CNE-23-vlan间路由
  • 《企业应用架构模式》笔记
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-transformer.py
  • Web3.0时代的挑战与机遇:以开源2+1链动模式AI智能名片S2B2C商城小程序为例的深度探讨
  • 算法-接雨水
  • 第05章 10 地形梯度场模拟显示
  • RGB ByteBuffer 转换成 Bitmap
  • 深度剖析C++17中的std::optional:处理可能缺失值的利器
  • Flutter使用Flavor实现切换环境和多渠道打包
  • Linux网络之序列化和反序列化
  • 无人机红外热成像:应急消防的“透视眼”
  • 实验一---典型环节及其阶跃响应---自动控制原理实验课
  • ZYNQ-IP-AXI-GPIO
  • python文件操作汇总
  • 第05章 13 椭球体张量可视化应用一则-神经束追踪
  • DeepSeek 突然崛起的原因剖析