web-dev-qa-db-fra.com

Consignation et configuration pour une application console .Net Core 2.0?

Le code suivant a les erreurs. Quelle est la bonne façon de configurer la gestion de la journalisation et de la configuration pour l'application console .Net Core 2.0?

L'erreur CS1061 'LoggerFactory' ne contient pas de définition pour 'AddConsole' et aucune méthode d'extension 'AddConsole' acceptant un premier argument de type 'LoggerFactory' n'a pu être trouvée (il manque une directive using ou une référence Assembly?)

Erreur CS1503 Argument 2: impossible de convertir 'Microsoft.Extensions.Configuration.IConfigurationSection' en '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());
            }
        }
    }
}
21
ca9163d9

Il semblerait qu'il vous manque quelques dépendances:

  1. Microsoft.Extensions.Logging.Console , qui fournit la méthode d’extension AddConsole.
  2. Microsoft.Extensions.Options.ConfigurationExtensions , qui fournit le Configure<T> méthode d’extension qui semble vous manquer.

Pour ce qui est de la configuration des services dans les exécutables .NET Core, Andrew Lock a un post sur le sujet de la première version de .NET Core. Une partie de cela est peut-être obsolète depuis l'arrivée récente de .NET Core 2, mais cela vaut la peine d'être lu.

19
Kirk Larkin

En vous appuyant sur la réponse de Kirk Larkins (assurez-vous que les paquets de nuget sont installés, Microsoft.Extensions.Options.ConfigurationExtensions, Microsoft.Extensions.Logging.Console Et Microsoft.Extensions.Logging.Debug), Vous pouvez simplifier la configuration de la journalisation et ignorer la déclaration de la loggerFactory. en passant un ILoggerBuilder à .AddLogging():

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;
}
16
Marco