![](/img/trans.png)
[英]Changing ASP.NET Core 2.0 Identity Connection String in Controller
[英]Access Connection String inside an ASP.NET Core controller
我正在使用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<MyContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyContext")));
[ ... ]
}
但我不知道如何在控制器中做到这一点。 我找到了本教程, 配置ASP.NET核心应用程序 ,但它使用一个类来访问配置的选项, public class MyOptions
我试过像在Startup.cs
, Configuration.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 =>
{
myOptions.ConnString = Configuration.GetConnectionString("MyContext");
});
...
}
然后
public YourController ((IOptions<MyOptions> 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<IDataContext, DataContext>();
你的上下文应该是这样的:
public class DataContext : DbContext, IDataContext
{
public DbSet<User> Users { get; set; }
public DataContext(DbContextOptions options) : base(options)
{
}
}
那么你可以随处注入你的背景。
也许这不是你要找的答案。 在这种情况下,您可以添加模型并在配置中绑定它并注入模型
就像是:
services.Configure<AssetProviderServiceClientConfig>(
Configuration.GetSection("AssetProviderServiceClient"));
然后你可以注入你的选择
private readonly SchedulerConfig _config;
public YourController(IOptions<SchedulerConfig> 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<Entity>();
}
也许有一些不正确的行...内存不足:)
你可以使用DbContextDatabase.GetDbConnection()。ConnectionString获取指定的上下文连接字符串,就像这样
public HomeController(DbContext context)
{
var connectionString = context.Database.GetDbConnection().ConnectionString;
}
更新:或者您可以创建委托
public delegate string ConnectionStringExporter();
然后将其注册为
services.AddSingleton<ConnectionStringExporter>(() => Configuration.GetConnectionString("Default"));
在控制器中你可以注入它
public HomeController( ConnectionStringExporter exporter)
那么你可以使用var connectionString = exporter();
获得connectionstring var connectionString = exporter();
您还可以使用指定的连接字符串名称添加委托参数。 像public delegate string ConnectionStringExporter(string name);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.