2017-08-16 166 views
1

所以,我一直在关注this guide,当然所有的例子都是要么在访问中,他们被宣布同样的方法或控制器中的选项。对于我的生活,我无法弄清楚如何让它与任何随机课程一起工作。配置.NET核心

这里是我当前的代码:

appsettings.json

{ 
    "Settings": { 
    "GameServerVersion": 14 
    }, 
    .... 
} 

Settings.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(); 
} 

JobManager.cs

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 

任何帮助或指导将不胜感激,因为我还是很新的C#。

+0

你应该在注册依赖注入容器的JobManager('services.AddSingleton'或类似),并从那里,而不是手动构建解决。 – Evk

+0

你可能会进入更多细节?我想我明白你的意思,但我不确定实施 –

回答

2

这是更好地(在你的情况类似静态RunAsync)不执行任何静态初始化当您使用依赖注入容器。相反,注册JobManager本身(最好是通过接口)的容器(假设你通过IOptions虽然构造函数在你的例子):

services.AddSingleton<JobManager>(); 

然后,后来,例如在Configure方法在你Startup类,解决它,并开始:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { 
    var jm = app.ApplicationServices.GetService<JobManager>(); 
    jm.StartAsync(); 
    // etc 
} 

如果您需要任何控制器使用JobManager - 只是通过它,虽然构造 - 它会自动解决。

+0

先生,你是一位真正的英雄,非常感谢你。 GetService部分是缺失的链接。是否有可能使它与'IOptionsSnapshot'一起使用? –

+0

Nvm,这是Quartz.NET特定的东西,都很好。 –

+0

@ChrisSatchell IOptionsSnapshot也不例外。您在注册依赖注入容器的一些东西(或IOptions或IOptionsSnapshot的情况下 - 框架这是否),你可以传递作为参数在同一个容器中注册任何其他的东西构造。 – Evk