【发布时间】:2017-07-13 06:37:17
【问题描述】:
要在扩展方法中创建 ILogger,我将 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'。 在 Microsoft.Extensions.Logging.LoggerFactory.CreateLogger(字符串 categoryName) 在 Microsoft.Extensions.Logging.Logger`1..ctor(ILoggerFactory 工厂) 在 Microsoft.Extensions.Logging.LoggerFactoryExtensions.CreateLogger[T](ILoggerFactory 工厂)
那么存储ILoggerFactory 不正确吗?从扩展方法访问它的替代方法是什么?存储IServiceProvider 和GetRequiredService<ILoggerFactory> ?
【问题讨论】:
-
为什么需要在扩展方法中做登录?
-
你为什么要这样做?
-
出于同样的原因在别处添加日志记录。
-
ILoggerFactory默认注册为 Singleton。内置 DI 不应“意外”处理它。你什么时候收到ObjectDisposedException? -
我随机获取一些请求 - 我的应用程序是一个自托管的 Web API。我不会在我的代码中的任何地方放置它。其实这篇msdn文章提出了保持静态logger factorymsdn.microsoft.com/en-us/magazine/mt694089.aspx的模式
标签: c# asp.net-core .net-core asp.net-core-1.0