C# 从vNext中的appsetting.json读取启动外部的connectionstring

C# 从vNext中的appsetting.json读取启动外部的connectionstring,c#,asp.net-core,C#,Asp.net Core,我有一个项目类(Nuget包)。我需要在没有构造函数的静态类中读取到MongoDB的连接字符串 静态类方法: /// <summary> /// The default key MongoRepository will look for in the appsettings.json /// </summary> private const string DefaultConnectionstringNam

我有一个项目类(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);
        }
//
///默认键MongoRepository将在appsettings.json中查找
/// 
private const string DefaultConnectionstringName=“Data:MongoDB:mongoserver设置”;
/// 
///从appsettings.json检索默认connectionstring
/// 
///返回App.config或Web.config文件中的默认connectionstring。
公共静态字符串GetDefaultConnectionString()
{
var config=新配置();
返回config.Get(DefaultConnectionstringName);
}
我一直都是空的。。。如何在不使用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;
    }
//
///从App.config或Web.config文件检索默认连接字符串。
/// 
///返回App.config或Web.config文件中的默认connectionstring。
公共静态字符串GetDefaultConnectionString()
{
返回ConfigurationManager.ConnectionString[DefaultConnectionString].ConnectionString;
}
谢谢

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

是的,您可以在不使用DI的情况下在整个应用程序中使用配置。但建议仅在启动时使用配置API,然后:

创建与应用程序中的某些功能相对应的功能良好的设置对象,从而遵循接口隔离原则(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");

-但它有点过时。

类似的方法应该可以:

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

文档:

在您的启动中,您应该将连接字符串保存到
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");
    }
    // ...
}

1.appsetting.json中的ConnectionString

  • 在Startup.cs类中创建配置的单例实例
  • 使用依赖项注入[构造函数注入]从配置实例读取值
  • 最终输出

  • 以上所有答案都不适合我。我正在构建一个.NETCore2.1API

    我曾经

    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

    var config=new Configuration()是否使用RC1?在RC1必须使用ConfigurationBuilder:
    var config=new ConfigurationBuilder()
    。是@StasBoyarincev我使用的是RC1,您能告诉我使用ConfigurationBuilder的最佳方式吗?谢谢它可以工作,但不能在类库中工作,例如在my HomeController中。我没有提到这个规范。。。顺便说一下,我会标记为有效:)谢谢。明白了。是的,在这种情况下,您应该在启动项目的库中设置值,或者将其放在共享库中。最好的方法是重构代码,使其不使用静态和DI:)这应该是公认的答案。很棒的解释。我需要从appsettings.json中只读“Data”部分。我怎样才能做到呢?谢谢——这是一个很好的答案,准确地解决了我的问题。但是ProductConcrete是如何被实例化的呢?
    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();
    }