在 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
}
这似乎奏效了。它不需要太多额外的更改。
我有一个 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:
获取项目 IDvar 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
}
这似乎奏效了。它不需要太多额外的更改。