2017-08-28 102 views
4

下面的代码得到了错误。为.Net Core 2.0控制台应用程序设置日志记录和配置管理的正确方法是什么?.Net核心2.0控制台应用程序的记录和配置?

错误CS1061“的LoggerFactory”不包含关于“AddConsole”的定义和没有扩展方法“AddConsole”接受类型为“的LoggerFactory”的第一参数可以找到(是否缺少using指令或程序集引用?)

错误CS1503参数2:无法从 'Microsoft.Extensions.Configuration.IConfigurationSection' 到 'System.Action'

class Program 
{ 
    static void Main(string[] args) 
    { 
     var services = new ServiceCollection(); 
     ConfigureServices(services); 
     var serviceProvider = services.BuildServiceProvider(); 
     var app = serviceProvider.GetService<Application>(); 
     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<T> 

     IConfigurationRoot configuration = GetConfiguration(); 
     services.AddSingleton<IConfigurationRoot>(configuration); 

     // Support typed Options 
     services.AddOptions(); 
     services.Configure<MyOptions>(configuration.GetSection("MyOptions")); // Error! 

     services.AddTransient<Application>(); 
    } 

    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<Application> logger, IOptions<MyOptions> 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()); 
      } 
     } 
    } 
} 

回答

5

看起来你可能会丢失一对夫妇的依赖关系转换:

  1. Microsoft.Extensions.Logging.Console,它提供了AddConsole扩展方法。
  2. Microsoft.Extensions.Options.ConfigurationExtensions,它提供了Configure<T>扩展方法,你似乎缺少。

在配置.NET Core可执行文件中的服务方面,Andrew Lock对第一版.NET Core的主题有一个post。有些.NET Core 2最近的到来可能会过时,但值得一读。

+0

我加入相当几个参考文献和错误消失了。现在我运行'var app = serviceProvider.GetService ()'时得到了空值。我已经更新了这个问题。 – ca9163d9

+2

我发布了一个新问题https://stackoverflow.com/questions/45928025/net-core-2-0-console-program-got-null-value-when-running-serviceprovider-getse。 – ca9163d9

1

大厦在柯克·拉金斯答案(请确保您有的NuGet包installes),可以简化日志配置,并通过将在ILoggerBuilder.AddLogging()跳过的LoggerFactory声明:

public static IServiceProvider ConfigureServices(IServiceCollection serviceCollection) 
{ 
    //ILoggerFactory loggerFactory = new LoggerFactory() 
    // .AddConsole() 
    // .AddDebug(); 

    serviceCollection 
     .AddLogging(opt => 
     { 
      opt.AddConsole(); 
      opt.AddDebug(); 
     }) 
     .AddTransient<IFooService, FooService>(); 

    /*... rest of config */ 

    var serviceProvider = serviceCollection.BuildServiceProvider(); 
    return serviceProvider; 
} 
相关问题