2017-12-20 13 views
4

は、コントローラにロガーを注入する方法の例があります:ILogger <T>を注入するたびに新しいロガーが作成されますか? <a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x" rel="nofollow noreferrer">the documentation</a>で伐採サンプルに

public class TodoController : Controller 
{ 
    private readonly ITodoRepository _todoRepository; 
    private readonly ILogger _logger; 

    public TodoController(ITodoRepository todoRepository, 
     ILogger<TodoController> logger) 
    { 
     _todoRepository = todoRepository; 
     _logger = logger; 
    } 
} 

はDIフレームワークは、私はここのようなものにロガーを注入するたびに新しいロガーを作成していますか?より良い方法がありますか?

+1

ILoggerの実装がどのように登録されたかによって異なります。 – user3292642

答えて

6

これは、ソースを見て簡単に答えられます。

public static IServiceCollection AddLogging(this IServiceCollection services, Action<ILoggingBuilder> configure) 
{ 
    // … 

    services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>()); 
    services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>))); 

    // … 
} 

はありませんので、特定のタイプ Tため ILogger<T>インスタンスがある限り、アプリケーションが実行されているために残されています。あなたが services.AddLogging()行うと、デフォルトの動作は ILogger<T> is registered as a singletonということです。コントローラに ILogger<TodoController>を注入すると、そのたびに同じロガーインスタンスが渡されます。

もちろん、これはロガーにのみ適用されますが、コントローラ自体には適用されません。デフォルトでは、コントローラはDIの外で起動されますが、スコープ付きの有効期間で効果的に動作します。したがって、すべてのリクエストに新しいコントローラインスタンスが存在します。その前からロガーインスタンスを取得します。

あなたの最後の質問に答えるには、より良い方法がありますか?いいえ、この動作は既に良いものです(新しいロガーインスタンスが必要ないため)。をタイプTに注入することが適切な方法ですので、適切に分類されたロガーインスタンスを取得できます。あなたが決して見ることのない、より多くの高価なものがバックグラウンドで起こっているときに非常に細いロガーを心配する必要はありません)

関連する問題

 関連する問題