如何在另一个项目的上下文中读取appsettings.json? Asp.Net核心

时间:2018-05-27 18:47:37

标签: c# asp.net-core

我需要在两个地方使用相同的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> <select class="form-control select2" style="width: 100%;" id="drpSearchSubjCode"> <option></option> <option value="AL">Alabama</option> <option value="WY">Wyoming</option> </select> <button id="add">Add new option</button> <button id="sel">Select option</button>。在我的网站项目ConnectionString中,其中包含来自Insig.Api的{​​{1}}和另一个项目类库ConnectionString,其中是我的数据库上下文。

Insig.Api - Startup.cs

appsettings.json

Insig.Infrastructure - InsigContext.cs

Insing.Infrastructure

正如您所见,由于迁移(来自Code First方法),上下文中也需要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"))); } }

编辑 - 以下代码不起作用。当我尝试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); } } 时,我收到错误:ConnectionString

Add-Migration Init

3 个答案:

答案 0 :(得分:1)

我决定提供其他信息for my comment

就像作者一样,我面临着将连接字符串从API项目传递到Data项目的相同问题。我决定使用连接字符串指定全局设置,并将它们链接到两个项目。我一步一步去了through this article。结果,我设法在两个地方使用了连接字符串。

答案 1 :(得分:0)

您可以将IConfiguration注入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
{p> 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
}

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

答案 2 :(得分:-1)

您应该使用依赖注入在其他项目中注入IConfiguration接口。像这样:

private readonly IConfiguration _config;

public InsigContext(IConfiguration config) {
    _config = config;
}

然后你可以使用_config.GetConnectionString("DefaultConnection");方法获取连接字符串。