C# 配置.NET内核

C# 配置.NET内核,c#,dependency-injection,C#,Dependency Injection,所以我一直在关注,但是所有的例子要么是在声明选项的同一方法中访问选项,要么是在控制器中访问选项。就我的一生而言,我不知道如何让它与任何随机类一起工作 以下是我当前的代码: appsettings.json { "Settings": { "GameServerVersion": 14 }, .... } 设置.cs public class Settings { public int GameServerVersion { get; set; } } Startu

所以我一直在关注,但是所有的例子要么是在声明选项的同一方法中访问选项,要么是在控制器中访问选项。就我的一生而言,我不知道如何让它与任何随机类一起工作

以下是我当前的代码:

appsettings.json

{
  "Settings": {
    "GameServerVersion": 14
  },
  ....
}
设置.cs

public class Settings
{
    public int GameServerVersion { get; set; }
}
Startup.cs

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddCors();
    services.AddOptions();

    services.Configure<Settings>(this.Configuration.GetSection("Settings"));

    JobManager.StartAsync();
}
现在,指南建议我应该使用以下内容(适用于我的示例):


任何帮助或指导都将不胜感激,因为我对C#还是很陌生。

当您使用依赖注入容器时,最好不要执行任何静态初始化(如static
RunAsync
)。相反,在容器中注册
JobManager
本身(最好通过接口)(假设您通过构造函数传递
IOptions
,如示例所示):


如果您需要在任何控制器中使用
JobManager
,只需通过构造函数传递即可,它将自动解决。

您应该在依赖项注入容器(
services.AddSingleton
或类似容器)中注册您的JobManager然后从那里解决它,而不是手动构造。你能不能再详细一点?我想我明白你的意思,但我对实施情况不太确定。先生,你是一位真正的英雄,非常感谢。
GetService
部分是缺少的链接。有没有可能让它与
IOptionsSnapshot
一起工作?@ChrisSatchell IOptionsSnapshot也一样。您可以在依赖项注入容器中注册一些内容(或者在IOptions或IOptionsSnapshot的情况下,框架可以这样做),您可以将这些内容作为参数传递给在同一容器中注册的任何其他内容的构造函数。
public class JobManager
{
    private static IScheduler scheduler;

    public static async void StartAsync()
    {
        // Quartz.NET jobs
        // Setup scheduler, register jobs, etc.
        // Trying to retrieve ```Settings.GameServerVersion``` to pass it to one of the jobs
    }
}
private readonly Settings settings;

public JobManager(IOptions<Settings> settingsAccessor)
{
    settings = settingsAccessor.Value;
}
JobManager jm = new JobManager(); // cannot use an empty constructor obviously
jm.StartAsync(); // no longer a static method
services.AddSingleton<JobManager>();
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
    var jm = app.ApplicationServices.GetService<JobManager>();
    jm.StartAsync();
    // etc
}