c# - 如何确定服务是否已经添加到 IServiceCollection

标签 c# dependency-injection .net-core

我正在创建辅助类以通过库的 IServiceCollection 简化接口(interface)的配置和注入(inject)。 libraries 构造函数包含许多可能早先注入(inject)的依赖项。如果它们尚未插入到 IServiceCollection 中,则帮助程序类应添加它们。如何检测接口(interface)是否已经注入(inject)?

public static void AddClassLibrary(this IServiceCollection services
    , IConfiguration configuration)
{
     //Constructor for ClassLibrary requires LibraryConfig and IClass2 to be in place
     //TODO: check IServiceCollection to see if IClass2 is already in the collection. 
     //if not, add call helper class to add IClass2 to collection. 
     //How do I check to see if IClass2 is already in the collection?
     services.ConfigurePOCO<LibraryConfig>(configuration.GetSection("ConfigSection"));
     services.AddScoped<IClass1, ClassLibrary>();
}

最佳答案

Microsoft 已包含扩展方法以防止添加已存在的服务。例如:

// services.Count == 117
services.TryAddScoped<IClass1, ClassLibrary>();
// services.Count == 118
services.TryAddScoped<IClass1, ClassLibrary>();
// services.Count == 118

要使用它们,您需要添加以下 using 指令:

using Microsoft.Extensions.DependencyInjection.Extensions;

NOTE: If that isn't visible, you may need to install the Microsoft.Extensions.DependencyInjection.Abstractions NuGet package.

如果内置方法不能满足您的需求,您可以通过检查其ServiceType来检查服务是否存在。

if (!services.Any(x => x.ServiceType == typeof(IClass1)))
{
    // Service doesn't exist, do something
}

关于c# - 如何确定服务是否已经添加到 IServiceCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374002/

相关文章:

javascript - AMP 下拉错误 : 'onchange' may not appear in tag 'select'

C# - 加载表单后是否会立即触发任何事件?

java - Spring:如何隐藏依赖注入(inject)的bean?

.net - Google Cloud 和 Google.Cloud.Functions.Framework

java - 泛型类型的injector.getInstance

java - JSF 2 DI 与 CDI Java EE 6/7

.net-core - Postgresql 和 .Net Core 2.1 中的全文搜索问题

c# - Roslyn CSharpSyntaxRewriter 获取已实现接口(interface)的列表

C# 如何将我的程序添加到上下文菜单?

c# - 使用 DockPanel Suite 设置垂直停靠优先级高于水平停靠优先级