gpt4 book ai didi

c# - IServiceProvider 不返回单例实例

转载 作者:行者123 更新时间:2023-11-30 23:17:59 25 4
gpt4 key购买 nike

我正在使用 .Net Core,目前我正在使用它的 DI 引擎。

我的项目是一个类库,因此,asp的绑定(bind)在这里无关紧要。

我遵循了 this article 中的提示为了使 DI 工作。

现在,到了有趣的部分:

我制作了一个如下所示的服务提供者:

public static class ServiceProvider
{
public static IServiceProvider GetServiceProvider()
{
var services = new ServiceCollection();

//Singletons
services.AddSingleton<IInstance, Instance>();

//Transients
services.AddTransient<IDate, Date>();
services.AddTransient<IMath, Math>();
services.AddTransient<INumber, Number>();
return services.BuildServiceProvider();
}
}

然后我尝试在如下所示的静态类中执行它:

public static class MySingleton
{
public static IInstance Instance
=> ServiceProvider.GetServiceProvider().GetService<IInstance>();
}

为了测试单例行为,我已经这样测试了:

[Test]
public void Instance_HundredTimes_ReturnsSameInstance()
{
//Arrange
const int callCount = 100;
var results = new IInstance[callCount];

//Act
for (var i = 0; i < callCount; i++)
{
results[i] = MySingleton.Instance;
}

//Assert
Assert.That(results.Distinct().Count(), Is.EqualTo(1));
}

测试结果返回负面,而不是在 distinct 之后有一个引用(因为它是一个单例)我仍然有一百个实例。

我做错了什么吗?

我是否遗漏了配置中的任何内容?

最佳答案

您的问题出在这个代码块中:

public static class MySingleton
{
public static IInstance Instance
=> ServiceProvider.GetServiceProvider().GetService<IInstance>();
}

你在这里做的是调用ServiceProvider.GetServiceProvider().GetService<IInstance>() 每次访问该属性。这意味着实际上一个单例。你要做的是设置一次单例实例:

public static class MySingleton
{
public static IInstance Instance
{
get;
} = ServiceProvider.GetServiceProvider().GetService<IInstance>();
}

此外,您在创建服务时遇到了类似的问题。您创建一个新的 ServiceCollection每次你打电话GetServiceProvider() .你可能不想要那个。你可能想要这样的东西:

public static class ServiceProvider
{
private static IServiceProvider serviceProvider = null;

public static IServiceProvider GetServiceProvider()
{
if (serviceProvider == null)
{
var services = new ServiceCollection();

//Singletons
services.AddSingleton<IInstance, Instance>();

//Transients
services.AddTransient<IDate, Date>();
services.AddTransient<IMath, Math>();
services.AddTransient<INumber, Number>();

serviceProvider = services.BuildServiceProvider();
}
return serviceProvider;
}
}

关于c# - IServiceProvider 不返回单例实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com