作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
InvalidOperationException Cannot consume scoped service from singleton
是一个众所周知的场景described very well here
我正在研究一种重现此异常的方法(假设它来自依赖注入(inject)框架),但我没有成功。
我有 created a repo with a commit to illustrate it但基本上我有以下测试:
public class Given_Scoped_Repository_And_Singleton_Service_That_Uses_The_Repository_When_Getting_Service_From_Different_Scope_After_Disposing_First_Scope
: Given_When_Then_Test
{
private IServiceScope _scopeOne;
private IServiceScope _scopeTwo;
private ServiceSample _serviceSampleOne;
private ServiceSample _serviceSampleTwo;
protected override void Given()
{
var serviceCollection =
new ServiceCollection()
.AddScoped<RepositorySample>()
.AddSingleton<ServiceSample>()
.BuildServiceProvider();
_scopeOne = serviceCollection.CreateScope();
_scopeTwo = serviceCollection.CreateScope();
_serviceSampleOne = _scopeOne.ServiceProvider.GetService<ServiceSample>();
_scopeOne.Dispose();
}
protected override void When()
{
_serviceSampleTwo = _scopeTwo.ServiceProvider.GetService<ServiceSample>();
}
[Fact]
public void Then_It_Should_Get_The_Same_Service_Instance()
{
_serviceSampleOne.Should().Be(_serviceSampleTwo);
}
[Fact]
public void Then_It_Should_Have_The_Same_Repository_Instance()
{
_serviceSampleOne.RepositorySample.Should().Be(_serviceSampleTwo.RepositorySample);
}
}
class RepositorySample { }
class ServiceSample
{
public RepositorySample RepositorySample { get; }
public ServiceSample(RepositorySample repositorySample)
{
RepositorySample = repositorySample;
}
}
InvalidOperationException
抛出,因为我从不同的范围获得单例服务,期望存储库不同(因为它是范围的)。
这些测试没有失败即使我明确地处理了第一个实例化作用域
RepositorySample
的上下文我在这里有点困惑。
Microsoft.Extensions.DependencyInjection 3.1.3
不会抛出异常提醒我单例范围陷阱吗? RepositorySample
要处理的实例?不是,即使我有 RepositorySample
实现IDisposable
我可以看到作用域实例从未被释放(Dispose 方法未执行)最佳答案
它没有抛出异常,因为尚未指定验证范围的选项。
改变这个:
.BuildServiceProvider();
.BuildServiceProvider(new ServiceProviderOptions { ValidateScopes = true });
ServiceProviderOptions.ValidateScopes
true to perform check verifying that scoped services never gets resolved from root provider;
ServiceProvider
时执行验证。构建而不是等到服务解决:
.BuildServiceProvider(
new ServiceProviderOptions
{
ValidateScopes = true,
ValidateOnBuild = true
});
ServiceSample
,
RepositorySample
- 正如您在单元测试中所做的那样,但不要将它们注入(inject)任何 Controller 。尝试构建
ServiceProvider
时,您仍然会在启动时遇到异常。 .
关于c# - 无法在测试中重现异常无法从 Mvc 框架外的单例中使用范围服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60975543/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!