访问ASP.NET Core控制器内的连接字符串

我正在使用C#和.NET Framework 4.7开发ASP.NET Core 2.0.2 Web API。

我想从方法的控制器中获取appsettings.json的连接字符串。

我在Startup.cs中做到了:

 using Microsoft.Extensions.Configuration; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("MyContext"))); [ ... ] } 

但我不知道如何在控制器中做到这一点。 我找到了本教程, 配置ASP.NET核心应用程序 ,但它使用一个类来访问配置的选项, public class MyOptions

我试过像在Startup.csConfiguration.GetConnectionString("MyContext") ,但是它不识别Configuration类。

我的问题是:如何在控制器中获取连接字符串?

您可以直接将IConfiguration configuration注入控制器(默认情况下,它在DI容器中注册):

 // using Microsoft.Extensions.Configuration; public class YourController : Controller { public YourController (IConfiguration configuration) { var connString = Configuration.GetConnectionString("MyContext"); } } 

但无论如何,请考虑使用IOptions模式,因为它会更灵活。

 public class MyOptions { public string ConnString { get; set; } } public void ConfigureServices(IServiceCollection services) { // Adds services required for using options. services.AddOptions(); services.Configure(myOptions => { myOptions.ConnString = Configuration.GetConnectionString("MyContext"); }); ... } 

然后

  public YourController ((IOptions optionsAccessor) { var connString = optionsAccessor.Value.ConnString; } 

您可以将IConfiguration本身注入控制器并获取连接字符串:

 public class HomeController : Controller { private readonly string _connectionString; public HomeController(IConfiguration config) { _connectionString = config.GetConnectionString("MyContext"); } } 

你不需要你的连接字符串,你已经准备好注入你的dbcontext。 所以你可以基本上只注入你的dbcontext。 (不要在您的控制器中执行此操作,并将其分开,并创建存储库或其他内容并注入此内容)。

您需要在启动时添加1个额外的注入:

 services.AddScoped(); 

你的上下文应该是这样的:

 public class DataContext : DbContext, IDataContext { public DbSet Users { get; set; } public DataContext(DbContextOptions options) : base(options) { } } 

那么你可以随处注入你的背景。

也许这不是你要找的答案。 在这种情况下,您可以添加模型并在配置中绑定它并注入模型

就像是:

 services.Configure( Configuration.GetSection("AssetProviderServiceClient")); 

那么你可以注入你的选择

 private readonly SchedulerConfig _config; public YourController(IOptions config) { _config = config.Value; } 

干杯!

编辑:执行SP;

如果您的上下文被注入,您可以执行以下操作:

  var command = databaseContext.database.GetDbConnection().CreateCommand(); cmd.CommandText = "your SP"; cmd.CommandType = CommandType.StoredProcedure; using (var reader = cmd.ExecuteReader()) { var entitites = reader.MapToList(); } 

也许有一些不正确的行…内存不足:)

你可以使用DbContextDatabase.GetDbConnection()。ConnectionString获取指定的上下文连接字符串,就像这样

 public HomeController(DbContext context) { var connectionString = context.Database.GetDbConnection().ConnectionString; } 

更新:或者您可以创建委托

 public delegate string ConnectionStringExporter(); 

然后将其注册为

 services.AddSingleton(() => Configuration.GetConnectionString("Default")); 

在控制器中你可以注入它

 public HomeController( ConnectionStringExporter exporter) 

那么你可以使用var connectionString = exporter();获得connectionstring var connectionString = exporter();

您还可以使用指定的连接字符串名称添加委托参数。 像public delegate string ConnectionStringExporter(string name);