在 C# .Net Core 3.0 中无需调用构造函数即可获取 appsettings.json 个值

Get appsettings.json values without a constructor call in C# .Net Core 3.0

我有一个 class 来自较旧的 .NET Core 之前的项目,我正试图让它读取 appsettings.json 数据。问题在于它以一种似乎不会调用构造函数的方式被调用,因此通常的 IOptions<AppSettings> 构造函数注入方法不起作用。

从这个方法调用 class:

 private static string GetItemUrl(string language, string itemId)
    {
        return LinkHelp.Instance.Builder.BuildEditItemUrl(language, itemId);
    }

然后直接进入以下方法:

private LinkHelp()
    {
        // Various attempts at getting a config setting here
        var linkBuilderoptions = new ContentManagementHelpersOptions() { ProjectId = projectId };
        Builder = new LinkBuil(linkBuildoptions);         
    }

该方法确实使用了旧的预核心 AppSettingProvider.ProjectId 方法从 web.config:

获取项目 ID
var projectId = AppSettingProvider.ProjectId.ToString() ?? AppSettingProvider.DefaultProjectId.ToString();

我是否需要在项目中添加一个 web.config 并继续使用旧方法?或者有没有办法使它与 .Net Core 3.0 一起工作?

您可以像这样在引导过程中访问您的配置。

这就是您的 "Program" 的样子:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();
        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseIISIntegration()
            .UseStartup<Startup>();
}

在您的启动 class 中,您可以获得 IConfiguration 注入的实现,如下所示:

public class Startup : ServiceStartup
{
    private readonly IConfiguration _configuration;

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    /// <summary>
    ///     This method gets called by the runtime. Use this method to add services to the container.
    /// </summary>
    /// <param name="services"></param>
    public void ConfigureServices(IServiceCollection services)
    {
        var yourConfiguration = new YourOwnConfigurationClass();
        _configuration.Bind(nameof(YourOwnConfigurationClass), yourConfiguration );
        services.AddSingleton(yourConfiguration )
    }
} 

在这种情况下,您的 config.json 应该包含一个 属性 名称,该名称与您的 class 名称 YourOwnConfigurationClass 相对应。 YourOwnConfigurationClass 中的属性应与分配给名为 YourOwnConfigurationClass 的 属性 的属性相对应。

现在 YourConfigurationClass 可注射。

这是其中一个问题,您在漫长的一周后于周五离开,而简单的答案要到周末之后才会出现。嗯。

配置注入在 LinkHelp() 上不起作用 class - 项目已经定义了配置。但是所需要的只是进行一些小的更改以将配置从调用 class 传递到接收 class.

public LinkHelp(string projectId)
    {
        var linkBuilderoptions = new ContentManagementHelpersOptions() { ProjectId = projectId };
        Builder = new LinkBuil(linkBuildoptions);         
    }

然后以一种稍微新的方式调用 class(这个 class 已经可以访问配置):

private static string GetItemUrl(string language, string itemId)
{
    projectId = ProjectOptions.OptionsList.ProjectId;
    var editLink = LinkHelp(propjectId).Instance.Builder.BuildEditItemUrl(language, itemId);
    return editLink
}

这似乎奏效了。它不需要太多额外的更改。