- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 C# 和 Core .NET 构建类库。我正在尝试使用 config.json
文件中的配置。以下是该文件的内容:
config.json
{
"emailAddress":"someone@somewhere.com"
}
为了尝试将 config.json
用于我的配置,我在我的 project.json
Microsoft.Framework.ConfigurationModel.Json
文件。在我的代码中,我有以下内容:
MyClass.cs
using Microsoft.Framework.ConfigurationModel;
public class MyClass
{
public string GetEmailAddress()
{
// return ConfigurationManager.AppSettings["emailAddress"]; This is the approach I had been using since .NET 2.0
return ?; // What goes here?
}
}
自 .NET 2.0 以来,我一直在使用 ConfigurationManager.AppSettings["emailAddress"]
。但是,我现在正在尝试学习如何通过 IConfiguration
以新的方式进行操作。我的问题是,这是一个类库。出于这个原因,我不确定如何、在何处或何时加载配置文件。在传统的 .NET 中,我只需要为 ASP.NET 项目命名一个文件 web.config,为其他项目命名一个 app.config。现在,我不确定。我有一个 ASP.NET MVC 6 项目和一个 XUnit 项目。因此,我试图弄清楚如何在这两种情况下使用 config.json
。
谢谢!
最佳答案
IMO 类库应该与应用程序设置数据无关。通常,图书馆消费者是关心这些细节的人。是的,这并不总是正确的(例如,如果您有一个进行 RSA 加密/解密的类,您可能需要一些私有(private)配置以允许私钥生成/存储),但在大多数情况下,这是正确的。
因此,一般来说,尽量将应用程序设置保留在类库之外,并让使用者提供此类数据。在您的评论中,您提到了数据库的连接字符串。这是将数据保留在类库之外的一个完美示例。图书馆不应该关心它调用什么数据库来读取,只需要从一个数据库读取。下面的示例(如果有一些错误,我深表歉意,因为我是凭内存即时写的):
图书馆
使用连接字符串的库类
public class LibraryClassThatNeedsConnectionString
{
private string connectionString;
public LibraryClassThatNeedsConnectionString(string connectionString)
{
this.connectionString = connectionString;
}
public string ReadTheDatabase(int somePrimaryKeyIdToRead)
{
var result = string.Empty;
// Read your database and set result
return result;
}
}
申请
应用设置.json
{
"DatabaseSettings": {
"ConnectionString": "MySuperCoolConnectionStringWouldGoHere"
}
}
数据库设置.cs
public class DatabaseSettings
{
public string ConnectionString { get; set; }
}
启动.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
Configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
public IConfigurationRoot Configuration { get; }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Setup logging
// Configure app
}
public void ConfigureServices(IServiceCollection services)
{
// Configure services
services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
services.AddOptions();
// Register our class that reads the DB into the DI framework
services.AddTransient<IInterfaceForClass, ClassThatNeedsToReadDatabaseUsingLibrary>();
}
}
使用库类读取数据库的类
public interface IInterfaceForClass
{
string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead);
}
public class ClassThatNeedsToReadDatabaseUsingLibrary : IInterfaceForClass
{
private DatabaseSettings dbSettings;
private LibraryClassThatNeedsConnectionString libraryClassThatNeedsConnectionString;
public ClassThatNeedsToReadDatabaseUsingLibrary(IOptions<DatabaseSettings> dbOptions)
{
this.dbSettings = dbOptions.Value;
this.libraryClassThatNeedsConnectionString = new LibraryClassThatNeedsConnectionString(this.dbSettings.ConnectionString);
}
public string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead)
{
return this.libraryClassThatNeedsConnectionString.ReadTheDatabase(somePrimaryKeyIdToRead);
}
}
一些处理 UI 内容以从数据库中读取的 Controller 类
public class SomeController : Controller
{
private readonly classThatReadsFromDb;
public SomeController(IInterfaceForClass classThatReadsFromDb)
{
this.classThatReadsFromDb = classThatReadsFromDb;
}
// Controller methods
}
长话短说
尽量避免在类库中使用应用程序设置。相反,让您的类库对此类设置不可知,并让使用者传递这些设置。
编辑:
我将依赖注入(inject)添加到 Controller 类中,以演示使用依赖注入(inject)构建从数据库读取的类。这让 DI 系统解决必要的依赖关系(例如 DB 选项)。
这是一种方法(也是最好的方法)。另一种方法是将 IOptions 注入(inject) Controller 并手动更新从数据库读取的类并将选项传入(不是最佳实践,DI 是更好的方法)
关于c# - 在 C# 类库中使用 IConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27880433/
我有一个 API,我正在尝试使用 XUnit 对其进行一些集成测试。这是我的 API Controller 构造函数: public class MyController : Controller {
我试图模拟顶级(不是任何部分的一部分)配置值(.NET Core 的 IConfiguration),但徒劳无功。例如,这些都不起作用(使用 NSubstitute,但它与 Moq 或我相信的任何模拟
我想问一下如何创建 ASP.NET Core 配置的实例,这与我在知道 appsettings.json 的 Controller 构造函数中需要它时创建的实例相同。文件 喜欢 _config = A
我正在尝试从 appsettings.json 读取连接字符串,我正在使用: services.AddSingleton(Configuration); 启动时的这一行抛出空值。我是 core2.0
我可能已经盯着这个很久了,但是最近几天我已经跳入了用于 asp.net 的 MVC6,虽然我真的很喜欢这个,但我似乎找不到一种方便的方式来访问它之后的配置在 Start.cs 中定义为 Configu
我正在尝试在我的应用程序中检索配置。 我已将 IConfiguration 传递给需要提取一些设置的服务类。 这个类看起来有点像这样: private IConfiguration _configur
我正在为 ServiceCollection 编写自己的扩展方法来注册我的模块的类型,并且我需要从集合中访问 IConfiguration 实例来注册我的选项。 扩展方法 public static
以下内容仅供引用。 我有一个包含以下内容的 secrets.json: { "Message": "I still know what you did last summer." } 我需要使
我正在制作 fixture到我的tests . 在我的 FixtureFactory我自己做 ServiceCollection : private static ServiceCollect
我一直在尝试解决这个问题,但什么也想不起来了...... 使用 token 的 Web 应用程序,但有些事情让我退缩。 var key = new SymmetricSecurityKey(Encod
通过项目移动类(class)后,IConfiguration 之一方法,GetValue , 停止工作。用法是这样的: using Newtonsoft.Json; using System; usi
我正在使用 C# 和 Core .NET 构建类库。我正在尝试使用 config.json 文件中的配置。以下是该文件的内容: config.json { "emailAddress":"some
出于某种原因,我们无法在启动时从 Azure KeyVault 检索 secret 值。虽然 secret 似乎可以通过 IConfiguration 接口(interface)在过程中使用的方法中获
我们可以像这样将 IConfiguration 注入(inject)到类中: //Controller AppSettings obj = new AppSettings(_configuration
出于某种原因,我们无法在启动时从 Azure KeyVault 检索 secret 值。虽然 secret 似乎可以通过 IConfiguration 接口(interface)在过程中使用的方法中获
.NET Core 配置允许使用很多选项来添加值(环境变量、json 文件、命令行参数)。 我只是无法弄清楚并找到如何通过代码填充它的答案。 我正在为配置的扩展方法编写单元测试,我认为通过代码将其填充
我有一个非常简单的方法需要进行单元测试。 public static class ValidationExtensions { public static T GetValid(this IC
我正在使用 asp.net + Autofac。 我正在尝试加载一个自定义 JSON 配置文件,并基于该文件创建/实例化一个 IConfiguration 实例,或者至少将我的文件包含到默认情况下 a
我通常会做以下事情 static void Main() { IConfiguration config = new ConfigurationBuilder()
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilde
我是一名优秀的程序员,十分优秀!