gpt4 book ai didi

c# - 在 C# 类库中使用 IConfiguration

转载 作者:IT王子 更新时间:2023-10-29 04:20:25 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com