C# 从vNext中的appsetting.json读取启动外部的connectionstring
我有一个项目类(Nuget包)。我需要在没有构造函数的静态类中读取到MongoDB的连接字符串 静态类方法: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
/// <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
以上所有答案都不适合我。我正在构建一个.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();
}