【发布时间】:2017-04-28 09:17:53
【问题描述】:
我正在使用.Net Core,目前正面临它的 DI 引擎。
我的项目是一个类库,所以在这里asp的绑定是无关紧要的。
我按照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 之后没有单个引用(因为它是单例),我仍然有一百个实例。
我做错了吗?
我是否遗漏了配置中的任何内容?
【问题讨论】:
-
每次访问
MySingleton.Instance(通过调用ServiceProvider.GetServiceProvider())时,您都会创建一个IServiceProvider的新实例。 -
我假设
BuildServiceProvider()将我的配置保持为单例......如果是这种情况,我必须延迟加载或简单地维护提供程序的静态实例,一种或另一种方式? -
基于源代码,我没有看到任何
static修改器在 DI 中涉及的类上会使ServiceProvider成为共享的。是的,如果您尚未提供ServiceProvider的单个实例,则由您自己决定。 -
好的,所以不能完全避免
static/lazy代码...不过谢谢,感谢您的帮助!
标签: c# .net dependency-injection .net-core