C# 是否可以在创建ServiceProvider后执行代码?
我有一个基于ASP.NET Core 3.1 WebApi的项目,它是用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
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(选项);
})