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'.
。ロガーの登録で何が間違っていますか?
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に感謝します。
services.AddLogging();
は機能しなかったため、これら2つのステートメントをConfigureServices
に追加しました。
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
これで、DIコンテナは満足で、すべてが機能します。