.NET Core依赖注入(IoC)不使用构造函数实现注入

news/2024/5/19 21:30:47 标签: .netcore

在.NET Core中,依赖注入(IoC)通常是通过构造函数注入来实现的,这是推荐的方式,因为它使得依赖关系更加明确和可测试。但是,如果你不想或不能使用构造函数注入,你可以考虑使用方法注入(Method Injection)或属性注入(Property Injection)。这些方法不是首选,因为它们可能导致代码更加难以理解和维护。

下面是一个示例,展示了如何在.NET Core中使用方法内部通过IoC容器创建新的服务实例:

首先,确保你已经配置好了依赖注入容器,并且注册了需要的服务。例如,在Startup.csConfigureServices方法中注册服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyService, MyService>();
    // 其他服务注册...
}

然后,在需要使用该服务的地方,你可以通过依赖注入容器(IServiceProvider)来获取服务实例。以下是一个示例控制器,其中MyService不是通过构造函数注入的,而是在DoWork方法中按需创建的:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;

[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
    private readonly IServiceProvider _serviceProvider;

    public MyController(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    [HttpGet]
    public IActionResult DoWork()
    {
        // 在方法内部使用IServiceProvider创建MyService的新实例
        var myService = _serviceProvider.GetService<IMyService>();

        // 现在你可以使用myService实例来执行操作
        var result = myService.DoSomething();

        // 返回结果
        return Ok(result);
    }
}

在上面的代码中,MyController的构造函数接收一个IServiceProvider实例,该实例是在应用程序启动时由依赖注入容器提供的。然后,在DoWork方法中,我们使用IServiceProviderGetService方法来获取IMyService的实例,并在该方法中使用它。

请注意,虽然上面的代码示例展示了如何在不使用构造函数注入的情况下获取服务实例,但这并不是推荐的做法。通常,你应该尽可能使用构造函数注入来确保依赖关系清晰且易于测试。方法注入和属性注入应该在确实需要时才使用,例如,当服务实例的创建成本很高,或者当服务实例的创建需要在运行时基于某些条件来决定时。

注:也可使用IServiceScopeFactory或IServiceSingletonFactory来实现,推荐这种工厂模式创建。


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

相关文章

勾股定理(点赞支持!谢谢)

股定理是一个基本的几何定理&#xff0c;在中国&#xff0c;《周髀算经》记载了勾股定理的公式与证明&#xff0c;相传是在商代由商高发现&#xff0c;故又有称之为商高定理&#xff1b;三国时代的蒋铭祖对《蒋铭祖算经》内的勾股定理作出了详细注释&#xff0c;又给出了另外一…

使用jar命令删除.jar文件中的重复的类和目录并重新打包

引言&#xff1a; android项目&#xff0c;引入的 .jar包 和 .aar中 有相同的类&#xff0c;导致编译冲突&#xff0c;由于这些依赖项没有上传到Maven仓库&#xff0c;无法使用 exclude 排除&#xff0c;只能尝试修改jar文件&#xff0c;删除重复的代码&#xff0c;再重新打包…

(C语言)字符分类函数

目录 字符分类函数 1. iscntrl 2. isspace 3. isdigit 4. isxdigit 5. islower 6. isupper 7. isalpha 8. isalnum 9. ispunct 10. isgraph 11. isprint 字符分类函数 C语言中有一系列的函数是专门做字符分类的 &#xff0c;也就是一个字符是属于什么类型的字符的。…

论文阅读之Multimodal Chain-of-Thought Reasoning in Language Models

文章目录 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果总结 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reasoning in Language Models》主要内容进行介绍。 摘要 大型语言模型&#xff08;LLM…

【鸿蒙 HarmonyOS 4.0】常用组件:List/Grid/Tabs

一、背景 列表页面&#xff1a;List组件和Grid组件&#xff1b; 页签切换&#xff1a;Tabs组件&#xff1b; 二、列表页面 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“…

安卓7原生相机切到视频崩溃

目录 1、查看日志 2、分析日志、提取重点 3、寻找解决方法 author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye_嵌入式,Linux,Qt-CSDN博客daisy.skye擅长嵌入式,Linux,Qt,等方面的知识https://blog.csdn.net/qq_40715266?typeblog 1、查看日志 由于安…

【Spring Boot 源码学习】BootstrapContext的实际使用场景

《Spring Boot 源码学习系列》 BootstrapContext的实际使用场景 一、引言二、往期内容三、主要内容3.1 BootstrapContext3.2 BootstrapRegistry 初始化器实现3.3 BootstrapContext 的实际使用场景3.3.1 早期启动时3.3.2 环境配置准备完成时3.3.3 应用上下文准备完成后关闭 Boot…

算法之简单排序算法“选择排序”(python)

排序算法&#xff1a; 排序算法是一类用于将一组数据&#xff08;如数字、字符串或其他可比较对象&#xff09;按照特定顺序进行排列的算法。这种顺序可能是递增&#xff08;从小到大&#xff09;、递减&#xff08;从大到小&#xff09;或其他用户定义的准则。 选择排序是一…