访问ASP.NET Core Controller中的连接字符串



我正在开发带有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.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 =>
    {
        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();

获得ConnectionsTring

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

最新更新