Asp.net core 如何正确解析要在ASP.NET Core 3.1中的ConfigureServices()中使用的服务?

Asp.net core 如何正确解析要在ASP.NET Core 3.1中的ConfigureServices()中使用的服务?,asp.net-core,.net-core,asp.net-core-mvc,asp.net-core-3.0,asp.net-core-3.1,Asp.net Core,.net Core,Asp.net Core Mvc,Asp.net Core 3.0,Asp.net Core 3.1,我有一个基于ASP.NET Core 3.1的应用程序。在应用程序启动期间,我想在配置服务(iSeries收集服务)中注册我的服务。但在配置服务时,我希望根据数据库中的设置启动应用程序 这是我的密码 public void配置服务(IServiceCollection服务) { //寄存器上下文 services.AddDbContext(选项=> { options.UseMySql(Configuration.GetConnectionString(“MySqlServerConnecti

我有一个基于ASP.NET Core 3.1的应用程序。在应用程序启动期间,我想在
配置服务(iSeries收集服务)
中注册我的服务。但在配置服务时,我希望根据数据库中的设置启动应用程序

这是我的密码

public void配置服务(IServiceCollection服务)
{
//寄存器上下文
services.AddDbContext(选项=>
{
options.UseMySql(Configuration.GetConnectionString(“MySqlServerConnection”);
});
//重新输入设置提供程序
services.AddSingleton();
//创建一个错误的解析器!!
var resolver=services.BuildServiceProvider();
var setting=resolver.GetService();
List allowedCors=新列表()
{
setting.MainUrl.ToString()文件
};
if(setting.HasCustomAssetsUri)
{
allowedCors.Add(settings.AssetsUrl.ToString());
}
if(settings.HasCustomPhotosUri)
{
allowedCors.Add(settings.PhotosUrl.ToString());
}
services.AddCors(选项=>
{
options.AddPolicy(“AllowSubDomainTraffic”,
生成器=>
{
builder.WithOrigins(允许cors.ToArray())
.AllowAnyHeader()
.AllowAnyMethod();
});
});
//更多服务
}
正如您在上面的代码中所看到的,我注册了
IAppSetting
,但我立即想使用它来访问数据库,以便获得当前的配置。我当前正在调用
services.BuildServiceProvider()
来创建一个新的解析器,然后可以在其中使用它来创建
iappset
的实例

我的
AppSetting
实现取决于同样注册的
AppDbContext
。这是我的应用程序设置

公共类AppSetting:IAppSetting
{
私有AppDbContext上下文;
公共AppSetting(AppDbContext上下文)
{
this.context=上下文;
}
//方法。。。
}
调用
BuildServiceProvider()
将导致创建singleton服务的附加副本。所以我尽量避免这样做

如何在
ConfigureServices()
方法中正确注册并解析
iappset
,以便使用它访问数据库中的设置

已更新

我试图使用Nkosi提供的解决方案,但出现以下错误

System.InvalidOperationException:'无法解析作用域服务 来自根提供程序的“IAppSetting”

这是完整的堆栈跟踪

此异常最初是在此调用堆栈中引发的:
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(System.Type,Microsoft.Extensions.DependencyInjection.IServiceScope,Microsoft.Extensions.DependencyInjection.IServiceScope)
Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngeCallback.OnResolve(System.Type,Microsoft.Extensions.DependencyInjection.IServiceScope)
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(System.Type)
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(System.IServiceProvider,System.Type)
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)
...
[调用堆栈被截断]
services.AddSingleton();
services.AddSingleton(ctx=>
{
var setting=ctx.GetRequiredService();
返回设置;
});
参考

使用DI配置CORS选项,将所有逻辑移到配置委托中

/。。。
//寄存器上下文
services.AddDbContext(选项=>{
options.UseMySql(Configuration.GetConnectionString(“MySqlServerConnection”);
});
//重新输入设置提供程序
services.addScope();
//使用DI配置CORS选项
services.AddOptions()
.配置((选项,sp)=>{
使用(var scope=sp.CreateScope()){
IAppSetting settings=scope.ServiceProvider.GetRequiredService();
List allowedCors=新列表(){
setting.MainUrl.ToString()文件
};
if(setting.HasCustomAssetsUri){
allowedCors.Add(settings.AssetsUrl.ToString());
}
if(settings.HasCustomPhotosUri){
allowedCors.Add(settings.PhotosUrl.ToString());
}
options.AddPolicy(“AllowSubDomainTraffic”,builder=>{
builder.WithOrigins(允许cors.ToArray())
.AllowAnyHeader()
.AllowAnyMethod();
});
}
});
services.AddCors();
//...

这样一来,一切都推迟到实际需要的时候,您就不必过早地构建服务集合。

您不需要
AppSetting
来开始。使用配置系统从数据库加载设置。文档中的使用EF Core从数据库加载设置。您可以很容易地采用它来加载您的设置。至于在DI设置阶段访问配置,这是。您可以从
中检索所需的配置值
services.AddSingleton<AppSetting>();
services.AddSingleton<IAppSetting>(ctx =>
    {
      var setting = ctx.GetRequiredService<AppSetting>();
      return setting;
    });