【问题标题】:read connectionstring outside startup from appsetting.json in vNext从 vNext 中的 appsetting.json 读取启动之外的连接字符串
【发布时间】:2023-03-15 02:35:01
【问题描述】:

我有一个项目类(Nuget 包)。我需要在没有构造函数的静态类中读取我到 MongoDB 的连接字符串。

静态类方法:

        /// <summary>
        /// The default key MongoRepository will look for in the appsettings.json 
        /// </summary>
        private const string DefaultConnectionstringName = "Data:MongoDB:MongoServerSettings";

        /// <summary>
        /// Retrieves the default connectionstring from appsettings.json
        /// </summary>
        /// <returns>Returns the default connectionstring from the App.config or Web.config file.</returns>
        public static string GetDefaultConnectionString()
        {
            var config = new Configuration();
            return config.Get<string>(DefaultConnectionstringName);
        }

我总是null...如何在不使用DI的情况下获取Startup.cs之外的值?

有可能吗?

在我的旧代码中,我可以这样做:

/// <summary>
    /// Retrieves the default connectionstring from the App.config or Web.config file.
    /// </summary>
    /// <returns>Returns the default connectionstring from the App.config or Web.config file.</returns>
    public static string GetDefaultConnectionString()
    {
        return ConfigurationManager.ConnectionStrings[DefaultConnectionstringName].ConnectionString;
    }

谢谢!!

【问题讨论】:

  • var config = new Configuration(); 你使用 RC1 吗?在 RC1 必须使用 ConfigurationBuilder:var config = new ConfigurationBuilder().
  • 是的@StasBoyarincev 我正在使用 RC1,你能告诉我使用 ConfigurationBuilder 的最佳方法是什么吗?谢谢!

标签: c# asp.net-core


【解决方案1】:

1.appsetting.json中的ConnectionString

  1. 在 Startup.cs 类中创建单例配置实例

  1. 使用依赖注入[构造函数注入]从配置实例中读取值

  1. 最终输出

【讨论】:

  • 这应该是公认的答案。很棒的解释。
  • 我只需要从 appsettings.json 中读取“数据”部分。我怎样才能做到这一点
  • 谢谢 - 这是一个了不起的答案,完全解决了我的问题。
  • 好的。但是 ProductConcrete 是如何被实例化的呢?
【解决方案2】:

在您的启动中,您应该将连接字符串保存到Startup 上的静态属性中

public class Startup
{
    public static string ConnectionString { get; private set; }

    public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddUserSecrets();

        if (env.IsDevelopment())
        {
            // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
            builder.AddUserSecrets();
        }

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
        ConnectionString = Configuration.Get<string>("Data:MongoDB:MongoServerSettings");
    }
    // ...
}

那么你应该可以从任何地方访问它:

public static string GetDefaultConnectionString()
{
    return Startup.ConnectionString;
}

【讨论】:

  • 它可以工作,但不能在类库中工作,例如在我的 HomeController 中工作。我没有谈论这个规范......顺便说一下我会标记为有效:)
  • 谢谢。明白了。是的,在这种情况下,您应该从您的启动项目中设置库中的值,或者将其放入共享库中。最好的是重构你的代码,不使用静态变量并使用 DI :)
【解决方案3】:

这样的事情应该可以工作:

   public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
    {
        var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath).AddJsonFile("config.json");
        Configuration = builder.Build();
        var connStr = Configuration.Get("connString");
    }

文档:http://docs.asp.net/en/latest/fundamentals/configuration.html

【讨论】:

    【解决方案4】:

    以上答案都不适合我。我正在构建一个 .net core 2.1 api。

    我用过

    public class Startup 
    {
        public static string ConnectionString {get; private set;}
    
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
               if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseHsts();
                }
                ConnectionString = Configuration.GetConnectionString("xxxxxx");
                app.UseMvc();
    }
    

    然后每当我需要它时,我都会打电话给string ConnString = Startup.ConnectionString;

    【讨论】:

      【解决方案5】:

      如何在不使用 DI 的情况下获取 Startup.cs 之外的值?有可能吗?

      是的,您可以在没有 DI 的情况下在整个应用程序中使用 Configuration。但推荐仅在启动时使用配置 API 的方式,然后 Using Options:

      创建与应用程序中的某些功能相对应的精心设计的设置对象,从而遵循接口隔离原则 (ISP)(类仅取决于它们使用的配置设置)

      使用配置 API 的示例

      appsettings.json:

      {
        "Name": "Stas",
        "Surname": "Boyarincev"
      }
      

      使用配置:

      var builder = new ConfigurationBuilder()
                  .AddJsonFile("appsettings.json")
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                  .AddEnvironmentVariables();
      
      var Configuration = builder.Build();
      
      var name = Configuration.GetSection("name");
      var surname = Configuration.GetSection("surname");
      

      tutorial on docs.asp.net - 但它有点过时了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 2011-09-02
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多