2017-07-13 12 views
4

要建立在擴展方法​​我存儲ILoggerFactory在一個靜態類ILoggerFactory在擴展方法 - 壽命和處置

public static class ApplicationLogging 
{ 
    public static ILoggerFactory LoggerFactory { get; set; } 

    public static ILogger CreateLogger<T>() => 
     LoggerFactory?.CreateLogger<T>(); 

    public static ILogger CreateLogger(string name) => 
     LoggerFactory?.CreateLogger(name); 

} 

被設置與

public void Configure(ILoggerFactory loggerFactory) 
{ 
    ... 
    ApplicationLogging.LoggerFactory = loggerFactory; 
} 

然而,我注意到,ILoggerFactory被丟棄

System.ObjectDisposedException:無法訪問處置物體。 對象名稱:'LoggerFactory'。 at Microsoft.Extensions.Logging.LoggerFactory.CreateLogger(String categoryName) at Microsoft.Extensions.Logging.Logger`1..ctor(ILoggerFactory factory) at Microsoft.Extensions.Logging.LoggerFactoryExtensions.CreateLogger [T](ILoggerFactory factory )

那麼存儲ILoggerFactory是不正確的?從擴展方法訪問它的替代方法是什麼?店鋪IServiceProviderGetRequiredService<ILoggerFactory>

+2

爲什麼需要在擴展方法中進行日誌記錄? – Ignas

+0

你爲什麼這樣做? – Mardoxx

+0

出於同樣的原因在別處添加日誌記錄。 – ubi

回答

-1

喜歡的東西:

public class MyClass 
{ 
    private readonly ILogger _logger; 
    public MyClass(ILoggerFactory loggerFactory) 
    { 
     _logger = loggerFactory.CreateLogger<MyClass>(); 
     "Test".ToSomething(_logger); 
    } 

    public static string ToSomething(this string source, ILogger logger) 
    { 
     logger.LogInformation(source); 
     return source;  
    } 
} 
1

ILoggerFactory將不會被默認加入到DI容器。您應該使用提供的AddLogging()擴展方法進行註冊。

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddLogging() 
} 

在內部根本就

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

反正其他評論說 - 嘗試使用內置的DI容器如玉米粥儘可能代替自己的靜態類的依賴解決。

+0

在擴展方法中如何使用內置的DI容器? – ubi

+0

它不能除非你直接通過服務解析器作爲方法的參數。主要思想是你不應該將工廠方法作爲擴展方法。不要'ApplicationLogging'類與公共方法的簡單類,然後將它註冊到DI容器,如'Startup.ConfigureServices'方法的單,然後通過構造函數... – Set

+0

由於設置注入它。然後回到原來的問題。如何從擴展方法訪問ApplicationLogging實例? – ubi