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

rob*_*r78 5 c# inversion-of-control asp.net-core-webapi

我正在开发一个现有的 WebAPI 项目及其内部

\n\n
public void ConfigureServices(IServiceCollection services)\n
Run Code Online (Sandbox Code Playgroud)\n\n

IoC 容器的设置如下

\n\n
services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection"))));\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

问题

\n\n
    \n
  1. 我在哪里可以找到 Microsoft 的文档来解释“IServiceCollection.Add(new ServiceDescriptor ...”背后的概念(太少了)
  2. \n
\n\n

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

\n\n
    \n
  1. \xe2\x80\x9eservices.Add(new ServiceDescriptor ...\xe2\x80\x9c 做什​​么?
  2. \n
  3. 什么是服务描述符?
  4. \n
  5. 通过调试代码,我发现 SQLConnectionFactory 仅实例化一次。调用“services.Add”(总是)是否创建一个单例对象?如果是这样,与 services.AddSingleton 有什么区别?
  6. \n
\n

Tao*_*hou 5

\n

\xe2\x80\x9eservices.Add(new ServiceDescriptor ...\xe2\x80\x9c 做什​​么?

\n
\n\n

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

\n\n
public static IServiceCollection Add(\n    this IServiceCollection collection,\n    ServiceDescriptor descriptor)\n{\n    if (collection == null)\n    {\n        throw new ArgumentNullException(nameof(collection));\n    }\n\n    if (descriptor == null)\n    {\n        throw new ArgumentNullException(nameof(descriptor));\n    }\n\n    collection.Add(descriptor);\n    return collection;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于此代码,它将添加ServiceDescriptorServiceCollection.

\n\n
\n

什么是服务描述符?

\n
\n\n

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

\n\n
\n

通过调试代码,我发现 SQLConnectionFactory 仅实例化一次。调用“services.Add”(总是)是否创建一个单例对象?如果是这样,与 services.AddSingleton 有什么区别?

\n
\n\n

这取决于您是否通过了 的范围services.Add。默认范围services.addServiceLifetime. ServiceLifetime您可以通过传递类似的内容来描述不同范围的服务services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection")), ServiceLifetime.Scoped));

\n\n

services.Add和之间没有区别AddSingleton。刚刚通过的AddSingleton电话services.AddServiceLifetime.Singleton

\n\n
public static IServiceCollection AddSingleton(\n    this IServiceCollection services,\n    Type serviceType,\n    Type implementationType)\n{\n    if (services == null)\n    {\n        throw new ArgumentNullException(nameof(services));\n    }\n\n    if (serviceType == null)\n    {\n        throw new ArgumentNullException(nameof(serviceType));\n    }\n\n    if (implementationType == null)\n    {\n        throw new ArgumentNullException(nameof(implementationType));\n    }\n\n    return Add(services, serviceType, implementationType, ServiceLifetime.Singleton);\n}\n
Run Code Online (Sandbox Code Playgroud)\n