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 我没有问)
问题
- 在哪里可以找到微软的文档来解释"IServiceCollection.Add(new ServiceDescriptor ..."背后的概念(this太少了)
或者也许有人可以提供一些见解
- “services.Add(new ServiceDescriptor ...”是做什么的?
- 什么是服务描述符?
- 通过调试代码,我看到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.Add
和AddSingleton
没有区别。 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);
}
我正在处理现有的 WebAPI 项目并在
public void ConfigureServices(IServiceCollection services)
IoC 容器设置如下
services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection"))));
(还有很多 services.AddScoped 我没有问)
问题
- 在哪里可以找到微软的文档来解释"IServiceCollection.Add(new ServiceDescriptor ..."背后的概念(this太少了)
或者也许有人可以提供一些见解
- “services.Add(new ServiceDescriptor ...”是做什么的?
- 什么是服务描述符?
- 通过调试代码,我看到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.Add
和AddSingleton
没有区别。 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);
}