我正在开发带有C#和.NET Framework的Web API的ASP.NET Core 2.0.2 4.7。
我想在方法的控制器中从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 Core应用程序,但是它使用类访问Configuration的选项,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()。连接string获取指定的上下文连接字符串,例如
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();
您还可以添加带有指定连接字符串名称的委托参数。像public delegate string ConnectionStringExporter(string name);