繁体   English   中英

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

[英]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.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()。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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM