web-dev-qa-db-ja.com

ASP.NET MVC 6でインジェクション用にILoggerを登録する方法

ASP.NET MVC 6(beta-4)アプリを持っています。

public void ConfigureServices(IServiceCollection services)
{
    // Logging
    services.AddLogging();

    // ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
    // Add the console logger.
    loggerfactory.AddConsole(minLevel: LogLevel.Warning);

    // ...
}

そして、コントローラーがあります...

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    // ...
}

しかし、どういうわけかサービスが正しく登録されていないとき:InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.。ロガーの登録で何が間違っていますか?

36
Travis

services.AddLogging();が正しいことをして、ILoggerを登録していると仮定しました。ソースを確認した後( https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs )それが実際に登録されていることがわかりましたILogger<>ILoggerの署名をILogger<HomeController>に変更すると、上記の例が機能します。

public class HomeController : 
    Controller
{
    ILogger<HomeController> _logger;

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

    // ...
}

これを見つけるための正しい道を設定してくれた@Steveに感謝します。

82
Travis

services.AddLogging();は機能しなかったため、これら2つのステートメントをConfigureServicesに追加しました。

services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));

これで、DIコンテナは満足で、すべてが機能します。

7
rubito