.net core DI注入,构造函数含有动态参数

news/2024/5/19 23:06:43 标签: .netcore

使用.net core 开发的时候我们使用依赖注入来实例化需要的服务等,有时候这个服务类的构造函数是有参数的,此时想使用依赖注入就变得很麻烦。我们可以采用工厂模式,去构造demo如下

  1. person类
namespace DIDynamicConstructorParams.TestDI
{
    public class Person
    {
        public string Name { get; set; }

        public int Age { get; set; }

        private ILogger<Person> _loggerFactory;

        public Person(string name,int age, ILogger<Person> loggerFactory)
        {
            Name = name;
            Age = age;
            _loggerFactory = loggerFactory;
        }

        public string SayHello()
        {
            _loggerFactory.LogInformation("just a test");
            return $"hello {Name},my age is {Age}";
        }
    }
}

  1. 构造person的接口
namespace DIDynamicConstructorParams.TestDI
{
    public interface DIPersonFactory
    {
        Person CreatePerson(string name,int age, ILogger<Person> logger);
    }
}

  1. 接口实现
namespace DIDynamicConstructorParams.TestDI
{
    public class DI : DIPersonFactory
    {
        public Person CreatePerson(string name, int age,ILogger<Person> logger)
        {
            return new Person(name, age,logger);
        }
    }
}

  1. 注册
builder.Services.AddScoped<DIPersonFactory,DI>();
  1. 依赖注入生成person类
using DIDynamicConstructorParams.TestDI;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace DIDynamicConstructorParams.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class DIController : ControllerBase
    {

        private readonly DIPersonFactory _dIPersonFactory;

        private ILogger<Person> _loggerFactory;

        public DIController(DIPersonFactory dIPersonFactory, ILogger<Person> loggerFactory)
        {
            _dIPersonFactory = dIPersonFactory;
            _loggerFactory = loggerFactory;
        }

        [HttpGet]
        public string Test([FromQuery] string Name, [FromQuery] int Age)
        {
           Person person = _dIPersonFactory.CreatePerson(Name, Age,_loggerFactory);
            return person.SayHello();
        }
    }
}

https://stackoverflow.com/questions/41669433/net-core-dependency-injection-with-parameters-on-constructor

https://code-maze.com/dotnet-using-constructor-injection/


http://www.niftyadmin.cn/n/5052445.html

相关文章

防御XSS攻击的方法

以下是对于上述防御XSS攻击方法的具体实现示例&#xff1a; HttpOnly属性的设置&#xff1a; 在后端设置HttpOnly属性时&#xff0c;可以使用如下代码&#xff08;假设使用Node.js和Express框架&#xff09;&#xff1a; const express require(express); const app express…

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议&#xff08;Routing Information Protocol, RIP&#xff09;是一种内部网关协议&#xff0c;它位于应用层&#xff0c;使用520 UDP端口。RIP基于距离矢量算法&#xff08;Bellham-Ford&#xff09;根据…

进程管理--上下文切换

上下文&#xff1a;描述了任务的执行状态。包括任务执行过程中堆栈中的内容和寄存器值&#xff0c;获取的资源信息&#xff0c;自身状态等 上下文切换&#xff1a;当一个任务切换到另一个任务时&#xff0c;它需要保存当前任务的所有状态&#xff0c;即保存当前任务的上下文&a…

MQ - 32 基础功能:消息查询的设计

文章目录 导图概述什么时候会用到消息查询消息队列支持查询的理论基础消息数据存储结构关于索引的一些知识点内核支持简单查询根据 Offset 查询数据根据时间戳查询数据根据消息 ID 查询数据借助第三方工具实现复杂查询第三方引擎支持查询工具化简单查询总结导图 概述 从功能上…

软件测试/测试开发丨​利用ChatGPT编写测试用例

点此获取更多相关资料 简介 测试用例是测试人员的核心工作内容&#xff0c;是测试人员思想的“实现类”&#xff0c;其充分体现了测试的思路&#xff0c;可以为后续的测试行为提供指导&#xff0c;是测试人员了解业务的重要根据和质量之根本。如果测试用例设计得不完成&#x…

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0c;拟牛…

Linux 线程同步(重要) 互斥量

/*三个窗口卖一百张票 */#include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h> int tickets 0; void * sellticket(void * arg) {//卖票usleep(7000);while(tickets < 100) {printf("%ld 正在卖第 %d 张票\n",…

python中出现\x08 和 \x06等字符处理方式

在 Python 中&#xff0c;\x08 和 \x06 等字符编码代表的是控制字符&#xff0c;不可见且无实际意义。如果要去除这些字符编码&#xff0c;可以使用 正则 将其替换掉&#xff1a; import re # 原始字符串 text "hello world~ \x08\x08\x08\x08\x08\x08\x08\x08" # …