- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难理解为什么在使用 IApplicationBuilder.ApplicationServices
时,在启动配置方法中应用服务定位器模式的行为会有所不同。而不是IServiceProvider
.
当我使用 IApplicationBuilder.ApplicationServices
(设置 IServiceProvider
提供对 应用程序 的服务容器的访问)我收到以下错误:
Cannot resolve scoped service '...' from root provider
IServiceProvider
直接它就像一个魅力:
public void Configure(
IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider sp)
{
// 1 : resolving a scoped service directly from application services container
// IServiceProvider throws 'Cannot resolve scoped service from root provider'
var test1 = app.ApplicationServices.GetRequiredService<IMyScopedService>();
// 2 : works like a charm
var test2 = sp.GetRequiredService<IMyScopedService>();
// 3 : also works like a charm
var scope = app.ApplicationServices.CreateScope();
var test3 = scope.ServiceProvider.GetRequiredService<IMyScopedService>();
}
IServiceProvider
表现得好像它具有“服务范围”和 IApplicationBuilder.ApplicationServices
就像它在服务范围之外有一种“应用范围”?
IServiceProvider
与首先使用
IApplicationBuilder
创建范围相同。然后才从范围的服务提供商处解析范围内的服务。
IApplicationBuilder
的范围似乎(有人这样命名吗?)不在服务范围之内。但是当我查找
IApplicationBuilder我找不到有关根提供程序的任何信息。
最佳答案
这是设计使然。
ASP.NET 运行时实例化 IServiceProvider
以这种方式禁止从根目录解析的范围服务:
serviceCollection.BuildServiceProvider(validateScopes: true);
app.ApplicationServices
是根
IServiceProvider
.
sp
是
app.ApplicationServices
的 child .
Immediate Window
中的以下代码行检查这一点Visual Studio 的,在断点上(这样你可以直接访问内部
ServiceProviderEngineScope
):
app.ApplicationServices == ((Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)sp).Engine.Root
// true
所以
app.ApplicatoinServices
的独生子女可以解析范围服务。一个 child
sp
作为输入参数提供,您手动创建的第二个。
ServiceProvider
上给出了非常详细的回答和
Scope
默认行为
here .
关于c# - ApplicationServices(根)IServiceProvider 和注入(inject)的 IServiceProvider 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62080780/
我很难理解为什么在使用 IApplicationBuilder.ApplicationServices 时,在启动配置方法中应用服务定位器模式的行为会有所不同。而不是IServiceProvider
我正在使用 .Net Core,目前我正在使用它的 DI 引擎。 我的项目是一个类库,因此,asp的绑定(bind)在这里无关紧要。 我遵循了 this article 中的提示为了使 DI 工作。
TLDR:是否可以在 Startup 运行后修改 IServiceProvider? 我在运行时运行 dll(它实现了我的接口(interface))。因此有一个文件监听器后台作业,它会等到 plug
我是在探索 XNA 框架时提出这个问题的,但我希望有一个大致的了解。 ISomeService someService = (ISomeService)Game.GetServices(typeof(
IServiceProvider 基本上只是任何 IOC 容器的通用接口(interface),还是用于特定框架?我正在滚动我自己的轻量级 IOC 容器,我想知道我是否应该实现它。还有其他我应该实现的
我试图调试应用程序中的内存泄漏(请参阅相关的 question ),并且遇到了错误的行为。 在此代码中(当然是简化的代码片段): while (true) { usin
我正在尝试为 IServiceProvider 创建一个 Mock(使用 Moq),以便我可以测试我的存储库类: public class ApiResourceRepository : IApiRe
我正在使用 IHostBuilder在 .NET Core 2.1 控制台应用程序中。主要看起来像这样: public static async Task Main(string[] args
我正在编写一些设计时代码。我想使用这个片段:(找到 here) var dte = (EnvDTE.DTE) GetService(typeof(EnvDTE.DTE)); if (dte != nu
我想知道为什么不显式使用 IServiceProvider 来解决依赖关系,而不是单独注入(inject)每个依赖关系。换句话说,为什么要使用这种方法: public class A { pr
我需要在开源MFC应用程序中实现IServiceProvider接口(interface);特别是我的 TTSApp申请。 我正在尝试添加对 IAccessibleApplication interf
这是关于 .NET 的一般性问题 我得到了一个 IServiceProvider 的实例接口(interface),但我几乎没有关于从中可以得到什么的文档。我如何找到它可能提供的所有服务的列表? 最佳
我在查看我的一些旧代码时发现了一个混合的 IValueConverter/MarkupExtension 类。这让我想知道 ProvideValue 方法中的 IServiceProvider 是否真
我希望能够访问内置的 IoC 容器(IServiceProvider 我相信)。 我知道在代码中访问它通常是不好的做法,我们应该允许框架将所需的任何依赖项注入(inject)到 Controller
我需要使用 IServiceProvider 在 ASP.NET Core 1.0 的 ConfigureService 方法中访问 session 变量。 我有一个使用委托(delegate)/la
我正在研究 xamarin 表单上的“依赖注入(inject)”,并发现了一些使用类似 ContainerBuilder 的概念。 .网上找到的解决方案如this ,讨论如何进行 DI 设置并将它们注
我们可以访问 IServiceProvider作为: public class ProductService { private readonly IProductRepository _pr
我们可以访问 IServiceProvider作为: public class ProductService { private readonly IProductRepository _pr
如果您编写自己的 MarkupExtension,您可能会偶然发现 IServiceProvider serviceProvider 参数在设计时与运行时不同。例如,您无法获取 IRootObject
我正在实现一个新的 .NET Core 项目并为我的服务层进行依赖注入(inject)。我创建了一个实现 IServiceProvider 的接口(interface),现在必须实现 GetServi
我是一名优秀的程序员,十分优秀!