Microsoft 对 IServiceCollection.Add(new ServiceDescriptor(...)) 的有用文档在哪里?

Where is Microsoft's useful documentation for IServiceCollection.Add(new ServiceDescriptor(...))?

我正在处理现有的 WebAPI 项目并在

public void ConfigureServices(IServiceCollection services)

IoC 容器设置如下

services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection"))));

(还有很多 services.AddScoped 我没有问)

问题

  1. 在哪里可以找到微软的文档来解释"IServiceCollection.Add(new ServiceDescriptor ..."背后的概念(this太少了)

或者也许有人可以提供一些见解

  1. “services.Add(new ServiceDescriptor ...”是做什么的?
  2. 什么是服务描述符?
  3. 通过调试代码,我看到SQLConnectionFactory只被实例化了一次。调用 "services.Add"(总是)会创建一个单例对象吗?如果是这样,与 services.AddSingleton 有什么区别?

这个link可以提供一些解释 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

  • services.Add( 添加新的依赖注册,以后可以解决
  • new ServiceDescriptor constructor 向将提供新实例和生命周期描述的工厂提供显式注册
  • services.AddSingleton 只是一个 shorthand 用于在定义的生命周期内执行此操作 Singleton

What does „services.Add(new ServiceDescriptor ...“ do ?

有关services.Add的详细信息,您可以参考源代码Add

public static IServiceCollection Add(
    this IServiceCollection collection,
    ServiceDescriptor descriptor)
{
    if (collection == null)
    {
        throw new ArgumentNullException(nameof(collection));
    }

    if (descriptor == null)
    {
        throw new ArgumentNullException(nameof(descriptor));
    }

    collection.Add(descriptor);
    return collection;
}

对于此代码,它将 ServiceDescriptor 添加到 ServiceCollection

What is a ServiceDescriptor ?

ServiceDescriptor 描述服务及其服务类型、实现和生命周期。它将用于初始化具有指定实现类型的 ServiceDescriptor 的新实例。

By debugging the code, I see that SQLConnectionFactory is only instantiated once. Does the call "services.Add" (always) create a singleton object? If so what is the difference to services.AddSingleton?

这取决于您是否通过 services.Add 的范围。 services.add 的默认范围是 ServiceLifetime。您可以通过像 services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection")), ServiceLifetime.Scoped));

这样传递 ServiceLifetime 来描述具有不同范围的服务

services.AddAddSingleton没有区别。 AddSingleton 只需调用 services.Add 并传递 ServiceLifetime.Singleton

public static IServiceCollection AddSingleton(
    this IServiceCollection services,
    Type serviceType,
    Type implementationType)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (serviceType == null)
    {
        throw new ArgumentNullException(nameof(serviceType));
    }

    if (implementationType == null)
    {
        throw new ArgumentNullException(nameof(implementationType));
    }

    return Add(services, serviceType, implementationType, ServiceLifetime.Singleton);
}