C# 是否可以在创建ServiceProvider后执行代码?

C# 是否可以在创建ServiceProvider后执行代码?,c#,asp.net,asp.net-core,asp.net-core-3.0,asp.net-core-3.1,C#,Asp.net,Asp.net Core,Asp.net Core 3.0,Asp.net Core 3.1,我有一个基于ASP.NET Core 3.1 WebApi的项目,它是用C.编写的。我想在应用程序完成引导后执行一次代码 例如,我希望在创建IServiceProvider后执行以下代码,以避免创建IServiceProvider的第二个实例 我认为在IServiceCollection扩展上使用.AddOptions()将允许我定义一个函数,该函数将在创建IServiceProvider后调用。但事实并非如此 这就是我所做的。在ConfigureServices(IServiceCollect

我有一个基于ASP.NET Core 3.1 WebApi的项目,它是用
C.
编写的。我想在应用程序完成引导后执行一次代码

例如,我希望在创建
IServiceProvider
后执行以下代码,以避免创建
IServiceProvider
的第二个实例

我认为在
IServiceCollection
扩展上使用
.AddOptions()
将允许我定义一个函数,该函数将在创建
IServiceProvider
后调用。但事实并非如此

这就是我所做的。在
ConfigureServices(IServiceCollection服务)
方法中,我添加了以下代码

services.AddOptions()
        .Configure<IServiceProvider>((serviceProvider) =>
        {
            var items = serviceProvider.GetServices<ICustomInterface>();

            foreach (ICustomInterface item in items)
            {
                item.DoSome();
            }
        });
services.AddOptions()
.Configure((服务提供商)=>
{
var items=serviceProvider.GetServices();
foreach(项目中的ICustomiterFace项)
{
DoSome()项;
}
});
但是,
Configure()
中的代码永远不会被调用


在构建
IServiceProvider
之后,如何调用自定义代码?

考虑一下您的
program.cs
文件。通常,您会在此处看到启动web服务的
…Build().Run()
代码

如果将构建和运行阶段分开,则可以在服务开始服务请求之前评估服务提供商

var host=host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
}).Build();
//在这里进行初始化
var serviceProvider=host.Services;
var items=serviceProvider.GetServices();
foreach(项中的ICustomInterface项)
{
DoSome()项;
}
//开始你的服务
host.Run();

如果您已经看过的源代码,那么是的,您可以拥有自己的ServiceProviderFactory作为默认值,并在创建ServiceProvider后获得执行代码的好处

示例ServiceProviderFactory.cs

公共类示例ServiceProviderFactory:IServiceProviderFactory
{
专用只读服务提供商选项_选项;
公共示例ServiceProviderFactory(ServiceProviderOptions选项)
{
如果(选项==null)
抛出新ArgumentNullException(nameof(options));
_选项=选项;
}
公共IServiceProvider CreateServiceProvider(IServiceCollection容器生成器)
{
var serviceProvider=containerBuilder.BuildServiceProvider(_选项);
//托多:给你
var items=serviceProvider.GetServices();
foreach(项中的ICustomInterface项)
{
DoSome()项;
}
返回服务提供商;
}
}
在statrup上使用此ServiceProviderFactory而不是DefaultServiceProviderFactory更简单、更快的方法如下:

Program.cs

Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory((上下文)=>
{
var options=new ServiceProviderOptions()
{
ValidateOnBuild=false,//默认值,
ValidateScopes=context.HostingEnvironment.IsDevelopment(),
};
返回新的CustomServiceProviderFactory(选项);
})