【问题标题】:Get connection string in the controller? [duplicate]在控制器中获取连接字符串? [复制]
【发布时间】:2018-08-13 12:37:42
【问题描述】:

appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=....;User ID=...;Password=....."

Startup.cs:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<SyncOptions>(Configuration.GetSection("App"));
    services.AddDbContext<SinsoContext>(o => o.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    services.AddMvc();
}

如何获取 Controller 或 Service 类中的连接字符串?我尝试了以下代码,但它删除了密码。

var connStr = _context.Database.GetDbConnection().ConnectionString;

【问题讨论】:

  • 你为什么想要那个?这样做的最终意义是什么?
  • 为什么控制器需要知道连接字符串?
  • 我需要使用连接字符串进行批量复制。
  • 但是,这仍然不是控制器的代码,把它放在一个服务类中并注入它。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

您可以为此使用强类型配置。创建一个类:

public class ConnectionStringsConfig
{
    public string DefaultConnection { get; set; }
}

然后,将其添加到您的服务中:

services.Configure<ConnectionStringsConfig>(Configuration.GetSection("ConnectionStrings"));

然后,在你的控制器中,注入IOptionsSnapshot&lt;ConnectionStringsConfig&gt;:

public class FooController : Controller
{
    private ConnectionStringsConfig _connectionStrings;

    public FooController(IOptionsSnapshot<ConnectionStringsConfig> connectionStrings)
    {
        _connectionStrings = connectionStrings?.Value ?? throw new ArgumentNullException(nameof(connectionStrings));
    }
}

最后,只需在需要的地方使用_connectionStrings.DefaultConnection

也就是说,我同意其他人的观点,即这是一种代码味道。控制器不需要连接字符串。任何需要访问连接字符串的东西都应该存在于控制器之外的某个地方。但是,您可以使用相同的方法将连接字符串注入该帮助程序/服务类,然后将该帮助程序/服务类注入您的控制器。

【讨论】:

  • services.Configure&lt;ConnectionStringsConfig&gt;(Configuration.GetSection("ConnectionStrings"));services.AddTransient&lt;ConnectionStringsConfig&gt;(); 相比如何?
  • 完全不同。首先是如何将强类型配置绑定到类。第二个是你如何注册要依赖注入的东西。
【解决方案2】:

尝试设置Persist Security Info=True 示例:

connectionString="Persist Security Info=True;Data Source=MyDataSource;Initial Catalog=MyDatabase;user id=myUserId;password=pass"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多