rob*_*r78 5 c# inversion-of-control asp.net-core-webapi
我正在开发一个现有的 WebAPI 项目及其内部
\n\npublic void ConfigureServices(IServiceCollection services)\nRun Code Online (Sandbox Code Playgroud)\n\nIoC 容器的设置如下
\n\nservices.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection"))));\nRun Code Online (Sandbox Code Playgroud)\n\n(还有很多 services.AddScoped 我没有询问)
\n\n问题
\n\n或者也许有人可以提供一些见解
\n\n\n\n\n\xe2\x80\x9eservices.Add(new ServiceDescriptor ...\xe2\x80\x9c 做什么?
\n
有关详细信息,您可以参考添加services.Add源代码。
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}\nRun Code Online (Sandbox Code Playgroud)\n\n对于此代码,它将添加ServiceDescriptor到ServiceCollection.
\n\n\n什么是服务描述符?
\n
ServiceDescriptor描述服务及其服务类型、实现和生命周期。它将用于使用指定的实现类型初始化 ServiceDescriptor 的新实例。
\n\n\n通过调试代码,我发现 SQLConnectionFactory 仅实例化一次。调用“services.Add”(总是)是否创建一个单例对象?如果是这样,与 services.AddSingleton 有什么区别?
\n
这取决于您是否通过了 的范围services.Add。默认范围services.add是ServiceLifetime. ServiceLifetime您可以通过传递类似的内容来描述不同范围的服务services.Add(new ServiceDescriptor(typeof(ISQLConnectionFactory), new SQLConnectionFactory(GetConnectionString("DefaultConnection")), ServiceLifetime.Scoped));
services.Add和之间没有区别AddSingleton。刚刚通过的AddSingleton电话services.AddServiceLifetime.Singleton
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}\nRun Code Online (Sandbox Code Playgroud)\n