.net core 在.net core DI中多次注册可能会产生影响

.net core 在.net core DI中多次注册可能会产生影响,.net-core,dependency-injection,.net Core,Dependency Injection,如果.NETCore的DI中有多个服务注册,会发生什么不好的事情吗?例如,假设我们有以下代码 public void ConfigureServices(IServiceCollection services) { //.... services.AddHealthChecks(); //... } 在另一个(可能是扩展)类中,我们再次使用services.AddHealthChecks()。这会不会弄乱DI的容器 提前感谢您可以多次注册服务,而不会引发异常。问题是当您

如果.NETCore的DI中有多个服务注册,会发生什么不好的事情吗?例如,假设我们有以下代码

public void ConfigureServices(IServiceCollection services)
{
    //....
    services.AddHealthChecks();
    //...
}
在另一个(可能是扩展)类中,我们再次使用
services.AddHealthChecks()
。这会不会弄乱DI的容器


提前感谢

您可以多次注册服务,而不会引发异常。问题是当您在不同范围内多次注册服务时。考虑下面的例子:

公共接口IMyInterface
{
作废打印();
}
公共类MyInterface:IMyInterface
{
公开作废印刷品()
{
}
}
让我们用两个不同的作用域注册
IMyInterface

内部类程序
{
私有静态void Main(字符串[]args)
{
IServiceCollection服务=新的ServiceCollection();
services.addScope();
services.AddSingleton();
var provider=services.BuildServiceProvider();
对于(变量i=0;i<5;i++)
{
var scope=provider.CreateScope();
使用(范围)
{
var myInterface=scope.ServiceProvider.GetService();
WriteLine(myInterface.GetHashCode());
}
}
}
}
首先,按以下顺序注册
IMyInterface

services.AddScoped<IMyInterface, MyInterface>();
services.AddSingleton<IMyInterface, MyInterface>();

现在我们得到了
MyInterface
的作用域类型,hashcode每次都不同。您总是获得您的类型的最后一个注册范围

看看代码:

公共静态IHealthChecksBuilder添加健康检查(此IServiceCollection服务)
{
services.TryAddSingleton();
services.TryAddEnumerable(servicescriptor.Singleton());
返回新的HealthChecksBuilder(服务);
}
通过添加
services.AddHealthChecks()
不止一次,您只需将
HealthCheckService
IHostedService
注册为单一服务,我认为这不会影响健康检查功能

通过以下扩展,您可以找到重复注册:

公共静态类服务描述
{
私有静态列表描述符;
公共静态IHostBuilder配置服务描述检查(此IHostBuilder主机生成器)
{
hostBuilder.ConfigureServices(服务=>
{
描述符=服务。其中(i=>!i.ServiceType.Assembly.FullName.Contains(“Microsoft”))
.GroupBy(p=>p.ServiceType)
.Where(x=>x.Count()>1.ToList();
});
返回主机生成器;
}
公共静态IHost UseServiceDescriptionCheck(此IHost主机)
{
var logger=host.Services.GetRequiredService();
描述符。ForEach(项=>
{
var count=item.count();
logger.LogWarning(“类型为{Key}的服务已注册{count}次”,item.Key,count);
});
返回主机;
}
}
并以这种方式使用它:

公共类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args).Build().UseServiceDescriptionCheck().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.ConfigureServiceDescriptionCheck();
}

阅读以获取更多详细信息。

您可以多次注册服务,而不会引发异常。问题是当您在不同范围内多次注册服务时。考虑下面的例子:

公共接口IMyInterface
{
作废打印();
}
公共类MyInterface:IMyInterface
{
公开作废印刷品()
{
}
}
让我们用两个不同的作用域注册
IMyInterface

内部类程序
{
私有静态void Main(字符串[]args)
{
IServiceCollection服务=新的ServiceCollection();
services.addScope();
services.AddSingleton();
var provider=services.BuildServiceProvider();
对于(变量i=0;i<5;i++)
{
var scope=provider.CreateScope();
使用(范围)
{
var myInterface=scope.ServiceProvider.GetService();
WriteLine(myInterface.GetHashCode());
}
}
}
}
首先,按以下顺序注册
IMyInterface

services.AddScoped<IMyInterface, MyInterface>();
services.AddSingleton<IMyInterface, MyInterface>();

现在我们得到了
MyInterface
的作用域类型,hashcode每次都不同。您总是获得您的类型的最后一个注册范围

看看代码:

公共静态IHealthChecksBuilder添加健康检查(此IServiceCollection服务)
{
services.TryAddSingleton();
services.TryAddEnumerable(servicescriptor.Singleton());
返回新的HealthChecksBuilder(服务);
}
通过添加
services.AddHealthChecks()
不止一次,您只需将
HealthCheckService
IHostedService
注册为单一服务,我认为这不会影响健康检查功能

通过以下扩展,您可以找到重复注册:

公共静态类服务描述
{
私有静态列表描述符;
公共静态IHostBuilder配置服务描述检查(此IHostBuilder主机生成器)
{
hostBuilder.ConfigureServices(服务=>
{
描述符=服务。其中(i=>!i.ServiceType.Assembly.FullName.Contains(“Microsoft”))
.GroupBy(p=>p.ServiceType)
.Where(x=>x.Count()>1.ToList();
});
返回主机生成器;
}
公共静态IHost UseServiceDescriptionCheck(此IHost主机)
{
var logger=host.Services.GetRequiredService();
扩散系数