gpt4 book ai didi

c# - 如何在另一个项目的上下文中读取 appsettings.json?网络核心

转载 作者:行者123 更新时间:2023-12-05 06:33:47 24 4
gpt4 key购买 nike

我需要在两个地方使用相同的 ConnectionString。在我的 Web 项目 Insig.Api 中包含来自 appsettings.jsonConnectionString 和另一个项目类库 Insing.Infrastructure 我的数据库上下文在哪里。

Insig.Api - Startup.cs

public class Startup
{
public IConfiguration Configuration { get; }

public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

services.AddSingleton(Configuration);
services.AddDbContext<InsigContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}

Insig.Infrastructure - InsigContext.cs

public class InsigContext : DbContext, IDesignTimeDbContextFactory<InsigContext>
{
public InsigContext() { }

public InsigContext(DbContextOptions<InsigContext> options) : base(options) { }

public DbSet<Sample> Samples { get; set; }

public InsigContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<InsigContext>();

builder.UseSqlServer("Data Source=.\\SQLEXPRESS;Initial Catalog=InsigDB;Integrated Security=True;MultipleActiveResultSets=True");
// Here I would like to use ConnectionString instead of raw string.

return new InsigContext(builder.Options);
}
}

如您所见,由于迁移(来自 Code First 方法),上下文中也需要 ConnectionString


编辑 - 下面的代码不起作用。当我尝试 Add-Migration Init 时收到错误消息:Value 不能为 null。参数名称:connectionString

public class InsigContext : DbContext
{
private readonly string _connectionString;

public InsigContext(DbContextOptions<InsigContext> options, IConfiguration configuration) : base(options)
{
_connectionString = configuration.GetSection("ConnectionStrings:DefaultConnection").Value;
}

public InsigContext() { }

public DbSet<Sample> Samples { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
}

最佳答案

您可以将 IConfiguration 注入(inject)您的 InsigContext 构造函数并使用它来获取连接字符串

private readonly string connectionString;
public InsigContext(DbContextOptions<InsigContext> options,IConfiguration configuration)
: base(options)
{
this.connectionString = configuration.GetSection("ConnectionStrings:DefaultConnection")
.Value;
}
// you can use this.connectionString now

IConfigurationMicrosoft.Extensions.Configuration 命名空间中定义。因此,您可能想在类库中添加对它的引用。

如果你想在另一个方法中访问 IConfiguration 对象,创建一个局部变量并在你的构造函数中设置它

private readonly IConfiguration configuration;
public InsigContext(IConfiguration configuration)
{
this.configuration = configuration;
}

public void CreateDbContext(string[] args)
{
// you can use this.configuration here as needed or get conn string
}

不需要多个构造函数。在注入(inject)所需依赖项的位置保留一个构造函数。

关于c# - 如何在另一个项目的上下文中读取 appsettings.json?网络核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50555412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com