运行`serviceProvider.GetService ();`时,.Net core 2.0控制台程序得到空值。

以下.Net core 2.0控制台应用程序在运行serviceProvider.GetService();时得到null值serviceProvider.GetService();

 class Program { static void Main(string[] args) { var services = new ServiceCollection(); ConfigureServices(services); var serviceProvider = services.BuildServiceProvider(); var app = serviceProvider.GetService(); // Got null value Task.Run(() => app.Run()).Wait(); } private static void ConfigureServices(IServiceCollection services) { ILoggerFactory loggerFactory = new LoggerFactory() .AddConsole() .AddDebug(); services.AddSingleton(loggerFactory); // Add first my already configured instance services.AddLogging(); // Allow ILogger IConfigurationRoot configuration = GetConfiguration(); services.AddSingleton(configuration); // Support typed Options services.AddOptions(); services.Configure(configuration.GetSection("MyOptions")); // Error! services.AddTransient(); } private static IConfigurationRoot GetConfiguration() { return new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile("App.config", optional: true).Build(); } public class MyOptions { public string Name { get; set; } } public class Application { ILogger _logger; MyOptions _settings; public Application(ILogger logger, IOptions settings) { _logger = logger; _settings = settings.Value; } public async Task Run() { try { _logger.LogInformation($"This is a console application for {_settings.Name}"); } catch (Exception ex) { _logger.LogError(ex.ToString()); } } } } 

我觉得它看起来不错,你只需要为你的选择提供单身。

 var options = new MyOptions(); configuration.GetSection("MyOptions").Bind(options); services.AddSingleton(options); 

然后,转移您的应用程序以使用该单例。

 public Application(ILogger logger, MyOptions settings) 

编辑:IOptions模式怎么样?

似乎其他人建议您在导入1.0.0-rc2-final版本的Microsoft.Extensions.Options.ConfigurationExtensions时可以使用该语法,但这也将级联到其他引用中。 可能不值得它只是后期绑定选项类。

所有工作(较少的IOptions)

如果这是一个正确的方法,那么该部分中的一些其他代码不起作用。 清理下面的版本。 希望有所帮助。

 class Program { static void Main(string[] args) { var services = new ServiceCollection(); ConfigureServices(services); var serviceProvider = services.BuildServiceProvider(); var app = serviceProvider.GetService(); // Got null value Task.Run(() => app.Run()).Wait(); } private static void ConfigureServices(IServiceCollection services) { ILoggerFactory loggerFactory = new LoggerFactory() .AddConsole() // Error! .AddDebug(); services.AddSingleton(loggerFactory); // Add first my already configured instance services.AddLogging(); // Allow ILogger IConfigurationRoot configuration = GetConfiguration(); services.AddSingleton(configuration); // Support typed Options var myOptions = new MyOptions(); configuration.GetSection("MyOptions").Bind(myOptions); services.AddSingleton(myOptions); services.AddTransient(); } private static IConfigurationRoot GetConfiguration() { return new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile("App.config", optional: true).Build(); } public class MyOptions { public string Name { get; set; } } public class Application { ILogger _logger; MyOptions _settings; public Application(ILogger logger, MyOptions settings) { _logger = logger; _settings = settings; } public async Task Run() { try { _logger.LogInformation($"This is a console application for {_settings.Name}"); } catch (Exception ex) { _logger.LogError(ex.ToString()); } } } }