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

我有以下情况:

startup.cs

services.AddSingleton<IConfigurationmanager,Configurationmanager>();
Configurationmanager configurationmanager = new Configurationmanager();
services.AddDbContext<MyContext>(options => 
    options.UseSqlServer(configurationmanager.DatabaseConnectionString));

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

是否可以在不显式实例化configurationmanager的情况下执行此操作,或者将其保留为这样甚至更好?

lovers_php 回答:在启动时获取单例服务实例

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

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

获得特定服务-

provider.GetService<T>();

尽管更好的选择是使用IConfiguration .NET Core提供的-https://docs.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);
});

但是,这里最好的选择可能是读取Iconfiguration中注入的Startup.cs

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"));
        });
    }
}
,

您也可以做类似的事情。 我不熟悉您如何使用配置管理器来提供准确的答案。

基本上,您可以在Program.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

本文链接:https://www.f2er.com/2926676.html

大家都在问