web-dev-qa-db-ja.com

Microsoft.Extensions.LoggingからILoggerを解決できません

コンソールアプリケーションのMainを次のように設定しました

var services = new ServiceCollection()
                .AddLogging(logging => logging.AddConsole())
                .BuildServiceProvider();

そして、私は別のクラスでそれを使用しようとします

    private readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }

System.InvalidOperationException: 'タイプ' Microsoft.Extensions.Logging.ILogger 'のサービスを解決できません

私は解決策を試してみました here が、それはうまくいきませんでした。

Edit以下のYaakovのコメントと このGithubコメント に基づいて、これを正しく解決することができます

    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }

私はこれを最初のBuildServiceProviderに含めることを望んでいましたが、ロガーを使用する(または独自のILoggerを作成する)たびにこれを繰り返す必要があるようです。

10
reggaemahn

ILoggerはデフォルトでは登録されなくなりましたが、ILogger<T>です。 ILoggerを引き続き使用する場合は、次のように手動で登録できます(Startup.cs)。

    public void ConfigureServices(IServiceCollection services)
    {
        var serviceProvider = services.BuildServiceProvider();
        var logger = serviceProvider.GetService<ILogger<AnyClass>>();
        services.AddSingleton(typeof(ILogger), logger);
        ...
     }

AnyClassは次のような一般的なものです。

     public class ApplicationLogs
     {
     }

そう:

        public void ConfigureServices(IServiceCollection services)
        {
            var serviceProvider = services.BuildServiceProvider();
            var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
            services.AddSingleton(typeof(ILogger), logger);
            ...
         }

ILoggerはコンストラクター注入を介して解決されるようになりました

3
Sam Shiles

.netコアWebアプリケーションのデフォルトテンプレートを使用していると仮定しています。
Startup.csには次のようなメソッドが必要です↓↓↓↓↓↓↓

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        //Do the service register here and extra stuff you want
         services.AddLogging(config =>
        {
            config.AddDebug();
            config.AddConsole();
            //etc
        });

    }

編集:私はあなたがそれがどのように機能するかを示すための簡単なプログラムを書きました

public class MyClass
{

    private readonly ILogger<MyClass> _logger;


    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }
    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }
}



public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection().AddLogging(logging => logging.AddConsole());
        services.AddSingleton<MyClass>();//Singleton or transient?!
        var s = services.BuildServiceProvider();
        var myclass = s.GetService<MyClass>();
     }
}

enter image description here 編集:プログラムの出力: enter image description here

2