首页
学习
活动
专区
工具
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>按基类获取实例。根据具体的业务需求,可以根据基类获取不同类型的实例,并进行相应的处理。

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

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

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

相关·内容

依赖注入[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
    领券