当前位置: 首页 > 知识库问答 >
问题:

如何获取IServiceProvider的实例。NET核心

廉飞捷
2023-03-14

IServiceProvider是一个具有单一方法的接口:

object GetService(Type serviceType);

它用于创建已注册的类型的实例。NET Core原生DI容器。

可以通过调用IServiceCollection的方法来获得IServiceProvider自身的实例。它似乎是通过框架的IServiceCollection实例神奇地调用的。

我想创建一个IServiceProvider的实例,而不需要Setup方法。我需要它来解决集成测试程序集中的依赖关系。在这种情况下有可能得到它吗?

共有3个答案

夏华藏
2023-03-14

以访问ASP的现有DI。NET核心应用程序,例如,在某些控制器中,您应该在构造函数中解析它。一些经理和工人的例子:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
   services.AddMvc();

   services.AddSingleton<IFooManager, FooManager>();
   services.AddTransient<IFooWorker, FooWorker>();
}

为经理手动解决工人:

public class FooManager: IFooManager
{
    private readonly IServiceProvider _serviceProvider;

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

    public void Start()
    {
        var w1 = _serviceProvider.GetRequiredService<IFooWorker>();  // new instance of FooWorker
        var w2 = _serviceProvider.GetRequiredService<IFooWorker>();  // new instance of FooWorker
    }
}
夹谷野
2023-03-14

这是Microsoft提供的IServiceCollection的默认实现:https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs

查看代码后,只需调用以下命令,您就可以获得IServiceCollection

var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();

希望有帮助:)

彭令秋
2023-03-14

正如goaty提到的,创建新的ServiceCollection就足够了。下面是可以用来访问DI容器的示例类。NET核心:

public static class ServiceProviderFactory
{
    public static IServiceProvider ServiceProvider { get; }

    static ServiceProviderFactory()
    {
        HostingEnvironment env = new HostingEnvironment();
        env.ContentRootPath = Directory.GetCurrentDirectory();
        env.EnvironmentName = "Development";

        Startup startup = new Startup(env);
        ServiceCollection sc = new ServiceCollection();
        startup.ConfigureServices(sc);
        ServiceProvider = sc.BuildServiceProvider();
    }
}

Startup类取自测试项目,因此服务注册不需要重复。

然后在测试类中简单地使用:

var foo = ServiceProviderFactory.ServiceProvider.GetServices(typeof(IFoo));
 类似资料:
  • rank ▲ ✰ vote url 56 390 59 554 url 如何获取实例的类名 如何才能获取一个实例对象的类名? 我想或许the inspect module可以实现,但是好像还没有发现什么能帮我的.或许可以分析__class__成员,但是我不知道怎么用. 你试没试类里的__name__属性?比如x.__class__.__name__或许可以得到你想要的 >>> import ite

  • 问题内容: 我正在使用Websockets(Java EE 7)将消息异步发送到所有连接的客户端的应用程序。每当创建新文章(我的应用程序中的参与模式)时,服务器(Websocket端点)应发送这些消息。 每次建立到websocket端点的连接时,我都会将相应的会话添加到列表中,我可以在外部访问该列表。 但是我遇到的问题是,当我访问所有外部(所有其他业务类)与之连接的客户端创建的websocket端

  • 经过很多挣扎(以及大量的指导,指南等),我设法设置了一个小型的.NET Core REST Web API,当存储的用户名和密码有效时,使用身份验证控制器颁发JWT令牌。 令牌将用户ID存储为子声明。 我还设法设置了Web API,以便在方法使用Authorize注释时验证这些标记。 现在我的问题是:我如何在我的控制器(在一个Web API中)中读取用户id(存储在主题声明中)? 这基本上是这个问

  • 我很好奇HttpURLConnection是如何获取连接的输入流的。我检查了父抽象类URLConnection的实现并找到了方法 > 扩展URL连接的HttpURLConnection不会重写此方法。所以想知道输入流引用是如何获得的? 与此相关的事情……超文本传输协议请求到底什么时候从客户端到服务器?是在调用getInputStream()的时候?还是在调用openConnection()的时候?

  • 问题内容: 由于引入了泛型,因此对Class进行了参数化,因此List.class生成Class 。这很清楚。 我无法弄清楚的是如何获取本身已参数化的Class类型的实例,即Class >。像下面的代码片段一样: 我经常遇到这个问题的变种,但我仍然不知道,是否只是想念一些东西,或者真的没有更好的方法。感谢您的建议。 问题答案: Class类是一种类型的运行时表示。由于参数化类型在运行时会进行类型擦

  • 问题内容: 我正在尝试使用MBean 绑定服务类的实例。 已经定义了我们要在代码中使用的。这就是它的意思。 我正在尝试通过以下代码访问此文件, 现在我有了MBean信息。我想要一个在MBean中定义的对象的实例。可能吗 ? 我知道一种方法,我们可以从MBean Info中获取类名称,也可以获取用于构造实例的属性。有什么更好的方法吗? 问题答案: 正如skaffman所指出的,您不能直接获取线程池的