具体来说,我在看微软的这行代码.扩展.依赖性注射.ServiceCollectionServiceExtensions.反恐精英:

public static IServiceCollection AddScoped<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory) where TService : class;

使用此方法的示例如下:

services.AddScoped<ICustomService>(sp => new CustomService(
    sp.GetRequiredService<IAnotherCustomService>(), "Param1", "Param2"));

我理解Func委托和lambda表达式是如何工作的,但我不理解IServiceProvider在幕后是如何初始化的.

推荐答案

此时,IServiceProvider尚未在幕后初始化.该框架只是捕获传入的委托,并将其保存到以后的某个时间,此时它有一个IServiceProvider实例,需要生成一个ICustomService.

这里没有特定的接口.同样的原则也适用于委托的任何参数类型.

// This captures the delegate in a variable
Func<int, string> f = i => i.ToString();

// This invokes the delegate with an instance of an `int`
f(1);
f(2);

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

PowerShell 5.1和7在使用证书时的区别

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

.NET MAUI 的登录页面

关于在 .NET 中干净地终止线程的问题

为什么 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

编译时禁用 Dll 文化文件夹

发布版本中的 Debug.WriteLine

使用返回随机结果的函数进行单元测试

Winforms:Application.Exit vs Environment.Exit vs Form.Close

使用多个 MemoryCache 实例

在 Moq Callback() 调用中设置变量值

获取当前方法的名称

数据库架构更改后更新 LINQ to SQL 类的最佳方法

DBNull 的意义何在?

如何确定字符串是 C# 中的有效 IPv4 还是 IPv6 地址?

如何在多个解决方案之间共享相同的 Resharper 设置,无需人工干预?

String.Join 与 StringBuilder:哪个更快?

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

连接字符串而不是使用一堆 TextBlocks