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

时间:2017-11-28 08:48:01

标签: c# asp.net-core configuration

我正在使用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.csConfiguration.GetConnectionString("MyContext")一样,但它不会识别Configuration类。

我的问题是: 如何在控制器中获取连接字符串?

4 个答案:

答案 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);