2017-08-28 28 views
4

次のコードでエラーが発生しました。 .Net Core 2.0コンソールアプリケーションのロギングと構成管理をセットアップする正しい方法は何ですか?.Net Core 2.0コンソールアプリケーションのロギングと設定?

エラーCS1061が「LoggerFactory」タイプの最初の引数を受け入れる「AddConsole」と拡張子なしのメソッド「AddConsole」の定義が含まれていませんが「LoggerFactory」が見つかりませんでした(あなたがusingディレクティブまたはアセンブリ参照が不足しています?)

エラーCS1503引数2:それはあなたが依存関係のカップルを欠落している可能性があります見えます

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

'System.Action' から 'Microsoft.Extensions.Configuration.IConfigurationSection' から変換することはできません:

  1. Microsoft.Extensions.Logging.Consoleこれは、AddConsole拡張方法を提供する。
  2. Microsoft.Extensions.Options.ConfigurationExtensions、これはConfigure<T>拡張メソッドを提供しています。

.NETコア実行可能ファイルでサービスを構成する観点から、Andrew Lockは.NETコアの最初のバージョンのトピックでpostを持っています。 .NET Core 2の最近の到着でこれは時代遅れになっているかもしれませんが、読んだだけの価値があります。

+0

私はかなり追加いくつかの参照とエラーがなくなっています。今度は、 'var app = serviceProvider.GetService ()'を実行するとnull値が返ってきます。私は質問を更新しました。 – ca9163d9

+2

私は新しい質問を投稿しました。https://stackoverflow.com/questions/45928025/net-core-2-0-console-program-got-null-value-when-running-serviceprovider-getse – ca9163d9

1

カークラーキンス応答時にビル(あなたがnugetパッケージinstallesを持っていることを確認してください)、ロギングの設定を簡素化し、.AddLogging()ILoggerBuilderに渡すことによって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; 
} 
関連する問題