2017-07-13 13 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