从.NET Core/ASP.NET Core中的类库访问应用程序密钥数据

本文关键字:Core NET 访问 应用程序 数据 类库 密钥 ASP | 更新日期: 2023-09-27 17:58:30

要访问类库中的应用程序密钥,我们是否需要在每个类库和需要访问AppKey的类中执行以下代码?

public static IConfigurationRoot Configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

这是我在微软文档中发现的,但这看起来非常多余。

项目中的启动类如下

 public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }
        public Startup()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json");
            Configuration = builder.Build();
        }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework().AddEntityFrameworkSqlServer()
                .AddDbContext<DbContext>(options =>
                    options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"]));
        }
    }

那么我应该如何在项目的每个类中注入这个"IConfigurationRoot"。我必须在每个类库中重复这个启动类吗?为什么这不是.NET核心框架的一部分?

从.NET Core/ASP.NET Core中的类库访问应用程序密钥数据

建议使用选项模式,该模式由Microsoft提供,在ASP.NET Core中大量使用。

基本上,您创建了一个强类型类,并在Startup.cs类中对其进行配置。

public class MySettings 
{
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

并在CCD_ 2类中对其进行初始化。

// load it directly from the appsettings.json "mysettings" section
services.Configure<MySettings>(Configuration.GetSection("mysettings"));
// do it manually
services.Configure<MySettings>(new MySettings 
{
    Value1 = "Some Value",
    Value2 = Configuration["somevalue:from:appsettings"]
});

然后在你需要的地方注入这些选项。

public class MyService : IMyService
{
    private readonly MySettings settings;
    public MyService(IOptions<MySettings> mysettings) 
    {
        this.settings = mySettings.Value;
    }
}

根据面向对象编程中的信息隐藏原理,大多数类不需要访问您的应用程序配置。只有您的主应用程序类才需要直接访问这些信息。类库应该公开属性和方法,以根据调用方认为必要的任何条件来改变它们的行为,应用程序应该使用其配置来设置正确的属性。

例如,DateBox不需要知道时区信息是如何存储在应用程序配置文件中的-它只需要知道它有一个DateBox.timezone属性,它可以在运行时检查它在哪个时区。