首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET Core3.1框架提供了DI -如何获取已注册类型的实例?

在.NET Core 3.1框架中,依赖注入(Dependency Injection)是一种常见的设计模式,用于管理对象之间的依赖关系。通过依赖注入,我们可以将对象的创建和使用解耦,提高代码的可测试性和可维护性。

在获取已注册类型的实例之前,我们需要先注册该类型及其对应的实现方式。通常,注册过程发生在应用程序的启动阶段,可以通过以下两种方式进行注册:

  1. 在Startup类的ConfigureServices方法中注册:
代码语言:txt
复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>();  // 单例模式
    services.AddScoped<IOtherService, OtherService>();  // 每次HTTP请求范围内一个实例
    services.AddTransient<IAnotherService, AnotherService>();  // 每次获取时创建一个新的实例
}

其中,IMyService、IOtherService和IAnotherService分别是接口,而MyService、OtherService和AnotherService是对应的实现类。

  1. 使用属性或构造函数注入:
代码语言:txt
复制
public class HomeController : Controller
{
    private readonly IMyService _myService;
    
    public HomeController(IMyService myService)
    {
        _myService = myService;
    }
    
    //...
}

在上述代码中,通过将IMyService类型的对象声明为构造函数的参数,依赖注入容器会自动查找并提供该类型的实例。

一旦我们完成了类型的注册,就可以在需要使用的地方获取已注册类型的实例。在控制器、服务类或其他需要的地方,可以通过构造函数、方法参数或属性来获取实例。

以下是几种获取已注册类型实例的方法:

  1. 构造函数注入:
代码语言:txt
复制
public class HomeController : Controller
{
    private readonly IMyService _myService;
    
    public HomeController(IMyService myService)
    {
        _myService = myService;
    }
    
    //...
}

在上述代码中,通过将IMyService类型的对象声明为构造函数的参数,依赖注入容器会自动查找并提供该类型的实例。

  1. 方法参数注入:
代码语言:txt
复制
public class HomeController : Controller
{
    private readonly IMyService _myService;
    
    public HomeController()
    {
    }
    
    public IActionResult Index(IMyService myService)
    {
        _myService = myService;
        
        //...
    }
    
    //...
}

在上述代码中,通过将IMyService类型的对象声明为方法的参数,依赖注入容器会自动查找并提供该类型的实例。

  1. 属性注入:
代码语言:txt
复制
public class HomeController : Controller
{
    [FromServices]
    public IMyService MyService { get; set; }
    
    //...
}

在上述代码中,通过将IMyService类型的属性标记为[FromServices],依赖注入容器会自动查找并提供该类型的实例。

需要注意的是,以上的获取方式都需要确保依赖注入容器已经正确配置和初始化。

对于.NET Core 3.1框架,腾讯云提供了一系列与云计算相关的产品,用于帮助开发者构建和扩展云原生应用。具体推荐的产品和产品介绍链接如下:

  1. 云原生数据库 TencentDB for MySQL:
    • 概念:基于MySQL构建的高性能、可扩展、高可靠的云数据库。
    • 优势:具备自动备份、容灾能力、可自定义扩展和调优等特性。
    • 应用场景:适用于Web应用、移动应用、物联网、大数据等多种场景。
    • 产品介绍链接:https://cloud.tencent.com/product/tcdb
  • 云服务器 CVM:
    • 概念:提供可弹性调整配置的虚拟机,支持多种操作系统和应用环境。
    • 优势:高性能、可定制、高可用、安全可靠。
    • 应用场景:适用于Web应用、移动应用、数据存储、大数据处理等场景。
    • 产品介绍链接:https://cloud.tencent.com/product/cvm
  • 人工智能平台 AI Lab:
    • 概念:腾讯云提供的全面覆盖的人工智能开发和应用服务平台。
    • 优势:集成多种人工智能技术,提供易于使用的API和工具。
    • 应用场景:适用于图像识别、自然语言处理、语音识别、机器学习等场景。
    • 产品介绍链接:https://cloud.tencent.com/product/ai

以上是关于.NET Core 3.1框架中依赖注入获取已注册类型实例的答案,以及腾讯云相关产品的介绍。希望能对您有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 依赖注入[6]: .NET Core DI框架[编程体验]

    毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动时构建请求处理管道过程中,以及利用该管道处理每个请求过程中使用到的服务对象均来源于DI容器。该DI容器不仅为ASP.NET Core框架提供必要的服务,同时作为了应用的服务提供者,依赖注入已经成为了ASP.NET Core应用基本的编程模式。在前面一系列的文章中,我们主要从理论层面讲述了依赖注入这种设计模式,补充必要的理论基础是为了能够理解与ASP.NET Core框架无缝集成的依赖注入框架的设计原理。我们总是采用“先简单体验,后者深入剖析”来讲述每一个知识点,所以我们利用一些简单的实例从编程层面来体验一下服务注册的添加和服务实例的提取。

    02

    从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入

    最近在把自己的一个老项目从Framework迁移到.Net Core 3.0,数据访问这块选择的是EFCore+Mysql。使用EF的话不可避免要和DbContext打交道,在Core中的常规用法一般是:创建一个XXXContext类继承自DbContext,实现一个拥有DbContextOptions参数的构造器,在启动类StartUp中的ConfigureServices方法里调用IServiceCollection的扩展方法AddDbContext,把上下文注入到DI容器中,然后在使用的地方通过构造函数的参数获取实例。OK,没任何毛病,官方示例也都是这么来用的。但是,通过构造函数这种方式来获取上下文实例其实很不方便,比如在Attribute或者静态类中,又或者是系统启动时初始化一些数据,更多的是如下一种场景:

    02

    Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成

    Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法。对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨髓”的东西,不论是在进行业务应用的开发,还是进行基础组件的开发,依赖注入是实现“松耦合”最为理想的方式(没有之一)。对于绝大部分AOP框架来说,它们最终都会体现为创建一个能够拦截的“代理对象”来实现对方法调用的拦截,但是.NET Core中针对服务实例的提供完全由通过IServiceProvider接口表示的DI容器来接管,所以Dora.Interception必须将两者无缝地集成在一起。与依赖注入框架的集成不仅仅体现在对可被拦截的代理对象的创建,同样应用在了针对拦截器的定义和注册上。

    03

    abp vnext2.0核心组件之DDD组件之实体结构源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备,接下去就是构建领域层,vnext整个领域层大致分为聚合根、实体、值对象、事件实体、仓储、服务等等,内容较多,所以我打算分随笔进行介绍.首先介绍领域实体。注:这边所说的实体,是abp团队提供的抽象.如果不了解领域相关的知识,建议阅读<<领域驱动设计:软件核心复杂性应对之道>>需要一定设计模式的功底.如果设计模式不了解,请移步本人的设计模式分类.我也是略懂,所以本文有不当之处,请指正!谢谢!另外提一点,贫血的领域模型和充血的领域模型有本质的区别.有兴趣的可以研究研究,后续有时间我也会补充随笔,大家一起来探讨.

    01

    某酒管集团-单例模式对性能的影响及思考

    摘要: 大概一年前开始在思考 构造函数中 依赖注入较多,这对系统性能及硬件资源消耗产生一些优化想法。一般较多公司的项目都使用Autofac 依赖注入(Scoped 作用域),但是发现过多的对象产生 会消耗 CPU , 内存 并给GC(垃圾回收)造成一定的压力。那么开始思考是否能够使用 单例 (Singleton)来解决这些问题呢?带着这些想法开始ReView整个项目的代码,排查是否存在 单例 会造成 线程安全 或 方法内修改全局变量的代码( 结果是乐观的.... )。于是开始了性能测试....论证.. 试运行... ,结果是超预期的(CPU 从 60%-降低到--》10%, 内存 从 33%-降低到--》20%, 接口平均响应时间 从 120毫秒--降低到--》50毫秒 . 1500/QPS (不含内部服务相互调用)) 和 @InCerry 沟通结果,说可以写个 案例 和大家分享分享... 于是乎 有了这一片文章。

    02

    abp vnext2.0核心组件之模块加载组件源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务框架,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext对其进行了解耦,支持AutoFac或者使用.Net Core的默认容器.vnext依然沿用EF core为主,其余ORM为辅助的思想,当然EF core来实现DDD确实有优势,EventBus提供了分布式版本,并提供了RabbitMQ的实现版本,Aop拦截器依然采用Castle.Core.AsyncInterceptor.这一点Dora.Interception貌似可以解决,估计如果高度组件化,那么这也是一个扩展点.整个模块加载系统更加的完善,提供了跟多可选择的特性,工作单元也进行了小幅度的重构,代码更加的通俗易懂(在实现异步工作单元嵌套的设计就有体现)等等还有很多,当然不是本文的重点,vnext2.0是个值得使用的框架.下面开始回到正题.

    03

    WPF NET5 Prism8.0的升级指南

    ​ 曾经我以学习的目的写了关于在.NET Core3.1使用Prism的系列文章.NET Core 3 WPF MVVM框架 Prism系列文章索引,也谢谢大家的支持,事实上当初的版本则是Prism7.2.0.1442(7.2)版本,而现在也发布了.NET5和最新的Prism8.0.0.1909(8.0)版本,因此同样的我想将之前的Prism Demo项目可以升级到最新,写这篇文章的目的是自己也能学习一番,而更多的是回答那些在我Prism系列文章下面留下的我认为可以拿来一讲一些问题,而有些问题我则是水平有限回答不了(真的不是不想回答)  然后我拿之前的Prism Demo项目,WPF从.NET Core3.1升级到.NET 5其实非常简单,无脑修改项目的TargetFramework为net5.0-windows就行了,但是当Prism7.2升级到Prism8.0,我发现build的时候报了很多错误,那么让我们来看看究竟Prism8.0更新了些啥

    04
    领券