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

如何从IServiceProvider.GetServices<T> (aspnet core DI)按基类获取实例?

在ASP.NET Core的依赖注入(DI)容器中,可以使用IServiceProvider.GetServices<T>方法按基类获取实例。这个方法返回一个IEnumerable<T>,其中包含所有实现了指定基类T的服务实例。

以下是从IServiceProvider.GetServices<T>按基类获取实例的步骤:

  1. 首先,在ASP.NET Core应用程序的Startup.cs文件中,确保已经注册了相关的服务。可以使用services.AddTransient<TBase, TImplementation>()services.AddScoped<TBase, TImplementation>()方法将基类TBase和实现类TImplementation进行注册。这样,当容器需要解析基类TBase时,会返回实现类TImplementation的实例。
  2. 在需要获取基类实例的地方,通过构造函数注入IServiceProvider接口,以便在需要时访问DI容器。
  3. 使用GetServices<T>方法按基类获取实例。在IServiceProvider接口上调用GetServices<TBase>(),其中TBase是基类的类型。这将返回一个IEnumerable<TBase>,其中包含所有实现了基类TBase的服务实例。

以下是一个示例代码:

代码语言:txt
复制
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;

namespace MyApp.Controllers
{
    public class BaseController
    {
        public virtual string GetName()
        {
            return "Base";
        }
    }

    public class DerivedController1 : BaseController
    {
        public override string GetName()
        {
            return "Derived 1";
        }
    }

    public class DerivedController2 : BaseController
    {
        public override string GetName()
        {
            return "Derived 2";
        }
    }

    public class HomeController : Controller
    {
        private readonly IEnumerable<BaseController> _controllers;

        public HomeController(IEnumerable<BaseController> controllers)
        {
            _controllers = controllers;
        }

        public IActionResult Index()
        {
            foreach (var controller in _controllers)
            {
                var name = controller.GetName();
                // 处理基类实例
            }

            return View();
        }
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<BaseController, DerivedController1>();
            services.AddTransient<BaseController, DerivedController2>();

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseMvcWithDefaultRoute();
        }
    }
}

在上面的示例中,HomeController的构造函数注入了一个IEnumerable<BaseController>,这样就可以通过_controllers属性获取所有实现了BaseController基类的控制器实例。

这是一个简单的示例,展示了如何使用IServiceProvider.GetServices<T>按基类获取实例。根据具体的业务需求,可以根据基类获取不同类型的实例,并进行相应的处理。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体的产品选择应根据实际需求和情况进行评估和决策。

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

相关·内容

asp.net coreDI框架思考以及服务实例获取方式总结

转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/ 整个asp.net core管道WebHostBuilder到WebHost到后续请求的中,...此时的实例化也是基于该ServicesCollection中注册的服务。它的生命周期是应用程序创建到结束的期间。也就是整个aspnet core整个管道的生命周期。...asp.net coreDI框架中服务的注册和服务实例化就是从这里开始的,贯彻到整个管道中.......这也是aspnet coreDI框架三大生命周期中“Scope”含义:指的是针对每个HTTP请求的上下文,也就是服务范围的生命周期与每个请求上下文绑定在一起。...总结一下aspnet core获取注册服务的实例如下: IServiceProvider.CreateScope() IServiceProvider.GetRequestService<IServiceScopeFactory

29220
  • 【ASP.NET Core 基础知识】--依赖注入(DI)--在ASP.NET Core中使用依赖注入

    1.2 定义服务 在ASP.NET Core中实现依赖注入的第二步是定义服务。服务是应用程序中需要注入到其他组件的对象或。服务可以是瞬态、作用域或单例的,这取决于它们是如何注册的。...如果服务没有对应的接口或,也可以直接创建一个,但最好还是提供一个接口或以支持依赖注入的灵活性。...定义接口或: 如果你创建了一个服务,那么应该为它定义一个接口或,以便其他组件可以依赖注入这个服务。 接口或定义了服务的公共行为,而具体的实现则由服务来完成。...使用依赖注入容器:如果可能,使用DI容器提供的API来获取服务,而不是直接调用服务定位器的解析方法。 提供清晰的文档:如果使用了服务定位器模式,确保文档清晰地说明为什么需要这样做,以及如何使用。...在依赖注入(DI)中,控制反转通常指的是将对象创建和管理的工作应用程序代码中移除,转而由外部容器(如ASP.NET Core内置的DI容器)来完成。

    36900

    Core官方DI剖析(1)--ServiceProvider和ServiceCollection

    前段时间看了蒋老师的Core文章,对于DI那一块感觉挺有意思,然后就看了一下Core官方DI的源码,这也算是第一个看得懂大部分源码的框架,虽然官方DI相对来说特别简单, 官方DI相对于其它框架(例如 autofac...)使用起来麻烦许多,既没有一次注入程序集中所有的功能,也没有方便的属性注入,所以感觉起来官方的DI框架只是一个简单的标准, ?...,这两个也是注册时使用的 ServiceDescriptor,ServiceCollection 这两个是我们使用注册服务的两个类型,注册服务时,DI都会封装成一个`ServiceDescriptor...,但是这是重载都是一些"虚"方法,其最终只是使用了3个方法进行注册 // 使用和派生类型实例化ServiceDescriptor对象,然后进行缓存, private static IServiceCollection...`的方法进行判断获取实例化的实际类型, ?

    1.2K10

    .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn.../aspnet/core/fundamentals/dependency-injection?...asp .net core 如何实现 在上一小节新建的 HelloApi 项目中修改 Program.cs namespace HelloApi { public class Program..."); } } } .NET Core DI 生命周期 // 依赖注入 // 任何时候获取到的都是一个新的实例 services.AddTransient<IHelloService...,不要使用全局状态,而改为使用全局单例 不要在内部自己实例化对象 每一个服务应该尽可能地小、易创建、易测试 服务范围检查 singleton 的服务不能依赖于 scoped 的服务 GitHub源码链接

    38251

    Core官方DI剖析(1)--ServiceProvider和ServiceCollection

    前段时间看了蒋老师的Core文章,对于DI那一块感觉挺有意思,然后就看了一下Core官方DI的源码,这也算是第一个看得懂大部分源码的框架,虽然官方DI相对来说特别简单, 官方DI相对于其它框架(例如 autofac...Core文章中也推荐了建议不要使用这种模式 首先从`ServiceDescriptor`和`ServiceCollection`来认识,这两个也是注册时使用的 ServiceDescriptor,ServiceCollection...:bell:ServiceCollectionServiceExtensions 扩展则以上面例子那样进行传入与派生类型(派生对象或工厂) **ServiceCollection类型可用成员...,但是这是重载都是一些"虚"方法,其最终只是使用了3个方法进行注册 // 使用和派生类型实例化ServiceDescriptor对象,然后进行缓存, private static IServiceCollection...`的方法进行判断获取实例化的实际类型, :bell: 访问修饰符是internal,所以此方法并没有对外开放,只允许内部使用 /// /// 获取当前注册类型的实例类型 //

    2K40

    .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn.../aspnet/core/fundamentals/dependency-injection?...依赖注入 与 依赖查找 依赖注入:通过编排告诉 IOC 容器整个内部类之间的依赖关系 依赖查找:通过回调或者上下文获取依赖 asp .net core 如何实现 在上一小节新建的 HelloApi 项目中修改..."); } } } .NET Core DI 生命周期 // 依赖注入 // 任何时候获取到的都是一个新的实例 services.AddTransient<IHelloService...不要使用静态和静态成员,不要使用全局状态,而改为使用全局单例 不要在内部自己实例化对象 每一个服务应该尽可能地小、易创建、易测试 服务范围检查 singleton 的服务不能依赖于 scoped 的服务

    31510

    拥抱.NET Core系列:Logging (1)

    在之前我们简单介绍了 .NET Core 中的 DI组件,没来及了解的童鞋可以翻翻我之前的文章。 接下来会对 .NET Core 中的 Logging 进行介绍。...如何根据类型确定分类名称? 在扩展方法内部使用了“GetTypeDisplayName(Type type)”来根据类型获取名称(里面有一些逻辑处理,但一般是采用“{命名空间}....日志域可以聚合一的消息,非常适合同一种类型不同维度的日志记录。 回到目录 日志过滤器 Logging提供了一个包装实现用来实现日志过滤,我们先来看看使用。 ?...回到目录 特殊的Logger => NullLogger 这个我觉得 .NET Core Orchard“偷”过来的,Orchard 满地的 NullLogger.Instance。...非常可惜的是,1.1.3版本中没有提供 NullLogger 这样的实现。好消息是在 .NET Standard2.0 中已经提供了 NullLogger 的实现。

    66111

    MVC 到使用 ASP.NET Core 6.0 的Minimal API

    MVC 到使用 ASP.NET Core 6.0 的Minimal API https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/ 2007...MVC 在MVC中,获得您的控制器时,ControllerBase您可以访问HttpContext,HttpRequest,HttpResponse和当前用户(ClaimsPrincipal类属性..., "Currency": [ "The Currency field is required." ] } } 这是 MVC 过滤器管道如何您的应用程序中删除重复的一个很好的例子...我在深入研究源代码时发现的一件事是,序列化对象ObjectResult[17]的IResult实现的仅支持序列化 JSON。有人告诉我这是设计使然,因为大多数开发人员很少需要支持其他媒体类型。...作为 ASP.NET Core 开发人员,您现在在如何构建 API 方面有多种选择,这只能是一件好事。如果您希望本文涵盖任何其他功能,请在Twitter 上联系[21]。

    7.6K10

    探索 .NET Core 依赖注入的 IServiceCollection

    什么是依赖注入(DI)和DI容器? Microsoft依赖项注入容器只是一组,它们组合到一个代码库中,这个库会自动创建并管理程序中需要的对象。...瞬时(Transient)和单例(Singleton)模式是相反的,每次使用时,DI容器都是创建一个新的实例。...作用域(Scoped),在一个作用域内,会使用同一个实例,像EF Core的DbContext上下文就被注册为作用域服务。 我们注册服务时会发生什么? 在上面的代码中,我已经注册了两个单例服务。...的一些核心知识,可以直接创建ServiceCollection来使用Microsoft DI框架,了解了IServiceCollection上的AddSingleton扩展方法是如何工作,以及它们最终创建了一个...原文链接: https://www.stevejgordon.co.uk/aspnet-core-dependency-injection-what-is-the-iservicecollection

    3.9K32

    ASP.NET Core2.2到3.0你可能会遇到这些问题

    So,就用vs2019+.NET Core3.0来跟着做一下Contoso University这个WEB应用,但是在基于3.0进行操作的时候遇到了一些问题,所以我就查看了微软的《 ASP.NET Core...2.0升3.0升级指南 就着今天遇到的问题,所以我整理下ASP.NET Core2.0升级3.0的一个升级指南,希望对大伙有所帮助,当然大伙也可以直接阅读微软的官方文档进行查看。...下面的代码显示了生成 ASP.NET Core 3.0 模板Program: public class Program { public static void Main(string[] args...WebHostBuilder到HostBuilder最显著的变化是依赖关系注入 (DI)。...HostBuilder DI 约束: 使DI容器只能构建一次。 避免产生的对象生存期问题,例如解决多个单例实例

    1.4K20

    【5min+】后台任务的积木。.NetCore中的IHostedService

    前言 这次终于可以给大家分享一些AspNet Core方面的东西了?。虽然本次提及的内容是.NET Core通用,但将以AspNet Core为例作为介绍。...IHostService 请注意 IHostedService 是 .NET Core 提出的,所以可以看到它并不是专门只针对于 AspNet Core。...在AspNet Core中的作用 那么如果是咱们要在AspNet Core中使用它,该如何操作呢?...那么是否意味着我们可以在自定义的 IHostedService 使用DI容器中的服务呢,或者说在自定义任务中注入其它。 答案是:肯定的。...理由是,HostService既然在Configure之前,就证明它目前所在的范围作用域还是在 “根” 级别上,所以当您注入一个非单例级别的会提示您“无法在根范围获取一个对象”。

    1.6K20
    领券