gpt4 book ai didi

c# - 谁以及如何在依赖注入(inject)中初始化接口(interface)

转载 作者:行者123 更新时间:2023-12-02 20:26:03 24 4
gpt4 key购买 nike

对于Asp.Net Core依赖注入(inject),我知道我们将依赖项注册到IServiceCollection中,并使用IServiceProvider来获取实例。

我想知道注册和初始化IServiceCollection的代码。

对于接口(interface)注入(inject),为什么它知道从ServiceCollection获取实例?哪些代码实现了这个功能?

我想知道全局控制者是谁以及如何控制它?

最佳答案

当您创建 ASP.NET Core 项目时,将为 Program.Main() 生成以下代码:

public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}

IServiceCollection 的实例在 WebHost.CreateDefaultBuilder(args) 内创建,然后传递给 Startup.ConfigureServices(IServiceCollection services) 调用.

如果您想跟踪 ASP.NET Core 源代码中的调用链,这里是(包括 github 上源代码的链接):

WebHost.CreateDefaultBuilder()调用 WebHostBuilderExtensions.UseDefaultServiceProvider() 扩展方法:

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder()

.UseIISIntegration()
// ...
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
});

// ...

return builder;
}

WebHostBuilderExtensions.UseDefaultServiceProvider()调用 WebHostBuilder.ConfigureServices() 方法:

public static IWebHostBuilder UseDefaultServiceProvider(this IWebHostBuilder hostBuilder, Action<WebHostBuilderContext, ServiceProviderOptions> configure)
{
return hostBuilder.ConfigureServices((context, services) =>
{
var options = new ServiceProviderOptions();
configure(context, options);
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(new DefaultServiceProviderFactory(options)));
});
}

WebHostBuilder最终创建 ServiceCollection 实例并调用 Startup.ConfigureServices() 方法(通过存储的操作):

private IServiceCollection BuildCommonServices(out AggregateException hostingStartupErrors)
{
// ...

// Creation of `ServiceCollection` instance
var services = new ServiceCollection();

// ...

foreach (var configureServices in _configureServicesDelegates)
{
configureServices(_context, services);
}

// ...
}

关于c# - 谁以及如何在依赖注入(inject)中初始化接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49874964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com