У меня есть приложение на основе ASP.NET Core 3.1. Во время запуска приложения в ConfigureServices(IServiceCollection services)
я хочу зарегистрировать свои службы. Но во время настройки служб я хочу загрузить приложение на основе настроек, найденных в базе данных.
Вот мой код
public void ConfigureServices(IServiceCollection services)
{
// Register context
services.AddDbContext<AppDbContext>(options =>
{
options.UseMySql(Configuration.GetConnectionString("MySqlServerConnection"));
});
// Reister the setting provider
services.AddSingleton<IAppSetting, AppSettings>();
// Create a resolver which is WRONG!!
var resolver = services.BuildServiceProvider();
var setting = resolver.GetService<IAppSetting>();
List<string> allowedCors = new List<string>()
{
setting.MainUrl.ToString()
};
if (setting.HasCustomAssetsUri)
{
allowedCors.Add(settings.AssetsUrl.ToString());
}
if (settings.HasCustomPhotosUri)
{
allowedCors.Add(settings.PhotosUrl.ToString());
}
services.AddCors(options =>
{
options.AddPolicy("AllowSubDomainTraffic",
builder =>
{
builder.WithOrigins(allowedCors.ToArray())
.AllowAnyHeader()
.AllowAnyMethod();
});
});
// More services
}
Как вы можете видеть в приведенном выше коде, я регистрирую IAppSetting
, но сразу хочу использовать его для доступа к базе данных, поэтому получите текущую конфигурацию. В настоящее время я вызываю services.BuildServiceProvider()
, чтобы создать новый преобразователь, в котором я могу затем использовать его для создания экземпляра IAppSetting
.
Моя реализация AppSetting
зависит от AppDbContext
, который также зарегистрирован. Вот мой AppSetting
public class AppSetting : IAppSetting
{
private AppDbContext context;
public AppSetting(AppDbContext context)
{
this.context = context;
}
// methods...
}
Вызов BuildServiceProvider()
приведет к созданию дополнительной копии одноэлементных служб. поэтому я стараюсь этого не делать.
Как я могу правильно зарегистрировать и затем разрешить IAppSetting
в методе ConfigureServices()
, чтобы я мог использовать его для доступа к настройкам, найденным в базе данных?
Обновлено
Я попытался использовать решение, представленное Nkosi, но получил следующую ошибку
System.InvalidOperationException: «Не удается разрешить службу с областью действия« IAppSetting »от корневого поставщика».
Вот полная трассировка стека.
This exception was originally thrown at this call stack:
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(System.Type, Microsoft.Extensions.DependencyInjection.IServiceScope, Microsoft.Extensions.DependencyInjection.IServiceScope)
Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.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)
...
[Call Stack Truncated]
AppSetting
, чтобы начать остроумие. Вместо этого используйте систему конфигурации для загрузки параметров из базы данных. - person Panagiotis Kanavos   schedule 06.02.2020IConfiguration
, переданного в Startup. - person Panagiotis Kanavos   schedule 06.02.2020