IServiceProvider是一个具有单一方法的接口:
object GetService(Type serviceType);
它用于创建已注册的类型的实例。NET Core原生DI容器。
可以通过调用IServiceCollection的方法来获得IServiceProvider自身的实例。它似乎是通过框架的IServiceCollection
实例神奇地调用的。
我想创建一个IServiceProvider
的实例,而不需要Setup
方法。我需要它来解决集成测试程序集中的依赖关系。在这种情况下有可能得到它吗?
以访问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
}
}
这是Microsoft提供的IServiceCollection的默认实现:https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceCollection.cs
查看代码后,只需调用以下命令,您就可以获得IServiceCollection
:
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection();
希望有帮助:)
正如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所指出的,您不能直接获取线程池的