我正在使用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")));
[ ... ]
}
但我不知道如何在控制器中执行此操作。我找到了本教程Configure an ASP.NET Core App,但它使用了一个类来访问配置选项public class MyOptions
我尝试过像Startup.cs
,Configuration.GetConnectionString("MyContext")
一样,但它不会识别Configuration
类。
我的问题是: 如何在控制器中获取连接字符串?
答案 0 :(得分:7)
您可以直接将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;
}
答案 1 :(得分:3)
您可以将If MsgBox(sMsg) = vbOK Then Workkbooks("MySheet").Range("A1") = sMsg
本身注入您的控制器并获取连接字符串:
IConfiguration
答案 2 :(得分:0)
你不需要你的连接字符串,你已经准备好注入你的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>();
}
也许有些行不正确......内存不足:)
答案 3 :(得分:-1)
你可以使用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();
您还可以使用指定的连接字符串名称添加委托参数。比如public delegate string ConnectionStringExporter(string name);