在启动时获取单一实例服务的实例



我有以下情况:

启动.cs

services.AddSingleton<IConfigurationManager, ConfigurationManager>();
ConfigurationManager configurationManager = new ConfigurationManager();
services.AddDbContext<MyContext>(options => 
options.UseSqlServer(configurationManager.DatabaseConnectionString));

因此,为了创建我的上下文,我需要此configurationManager提供给我的连接字符串。但是,我仍然希望将ConfigurationManager保留为服务。

有没有办法在不显式实例化configurationManager的情况下做到这一点,或者像这样保留它甚至没问题?

您可以使用服务提供程序获取服务实例:

构建服务提供商 -var provider = services.BuildServiceProvider();

获取特定服务 -

provider.GetService<T>();

虽然更好的选择是使用.NET Core提供的IConfiguration - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

使用此方法,您可以设置 IConfiguration 以解析Startup方法中的配置设置。然后,您可以从那里将这些设置注入到所需的类中。

可以在构建上下文时访问IServiceProvider

services.AddDbContext<MyContext>((serviceProvider, options) =>
{
var configManager = serviceProvider.GetService<IConfigurationManager>();
options.UseSqlServer(configManager.DatabaseConnectionString);
});

但是,在这里,您最好的选择可能是读取注入Startup.csIconfiguration

public class Startup
{
public IConfiguration Configuration { get; }
public IHostingEnvironment HostingEnvironment { get; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
HostingEnvironment = env;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("MyContext"));
});
}
}

你也可以做类似的sth。 我不熟悉您对配置管理器执行的操作以提供准确的答案。

基本上,您可以在程序.cs中进行预配置。

在此处构建您的配置。如您所见,我正在通过IConfigurationBuilder.

Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(AddDbConfiguration)
.UseStartup<Startup>();

private static void AddDbConfiguration(WebHostBuilderContext context, IConfigurationBuilder builder)
{
var configuration = builder.Build(); // you could instantiate you Configuration manager here and append to the configuration.
var connectionString = configuration.GetConnectionString("Database");
builder.AddDemoDbProvider(options => options.UseSqlServer(connectionString));
}

来源: https://medium.com/@dneimke/custom-configuration-in-net-core-2-193ff6f02046

最新更新