- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在处理一个使用简单注入(inject)器作为依赖注入(inject)器的项目。另一方面,该项目使用 Microsoft.Extensions.Logging 来记录某些类中发生的事件。
我的技术问题很容易解释。我想在我的 DI 中独立于正在调用的类 T 注册 ILogger,但是我确实需要从我的 ILoggerFactory.CreateLogger<T>()
中完成它方法,因为这会使用 Microsoft.Extensions.Configuration
获取记录器配置.
我需要使用这样的东西来实例化我的记录器:
private Microsoft.Extensions.Logging.ILogger CreateLogger<T>()
{
var factory = this.ResolveService<ILoggerFactory>();
var logger = factory.CreateLogger<T>();
return logger;
}
我可以通过以下方式实现注入(inject):
Container.Register(typeof(ILogger<>), typeof(Logger<>));
这使我们能够解决以下问题:
public class SomeApiController : ApiController
{
public SomeApiController(ILogger<SomeApiController> logger)
{
//logger is well instantiated, but doesn't got the configuration
logger.LogInformation("test log.");
}
}
但正如我所说,这样做并没有通过从 Microsoft.Extensions.Logging.ILoggerFactory
获得的配置。类,所以这没有用。
有没有办法注册ILogger<T>
通过使用我的 CreateLogger<T>
?
最佳答案
使用以下注册:
container.RegisterInstance<ILoggerFactory>(loggerFactory);
container.RegisterSingleton(typeof(ILogger<>), typeof(Logger<>));
或者,如果您将 Simple Injector 集成到通用主机或 ASP.NET Core 应用程序中,请使用 .AddLogging()甚至注入(inject)非泛型的扩展方法 ILogger
进入您的应用程序组件,如本 ASP.NET Core Startup
中所示类:
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(); // Adds logging to the framework
// AddSimpleInjector enables "cross wiring," which means you can let
// Simple Injector-resolved components to depend on the generic
// ILogger<T> abstraction.
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore();
// AddLogger allows Simple Injector-resolved components to depend on
// the non-generic Microsoft.Extensions.Logging.ILogger interface.
// Simple Injector will automatically inject the correct ILogger<T>
// for you.
options.AddLogging();
});
}
...
}
有关完整示例,请参阅 ASP.NET Core and ASP.NET Core MVC Integration Guide .
让应用程序组件依赖ILogger
而不是 ILogger<T>
,使您的代码更简单,更易于测试,并且不易出错。如果您使用的是不带 Service Collection integration 的简单注入(inject)器(如前面的示例所示,您可以使用以下注册让 Simple Injector 确保在注入(inject) Logger<T>
时仍然注入(inject)正确的 ILogger
:
container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
_ => true);
这确保每个应用程序组件都有自己的 Logger<T>
实例,其中 T
是记录器注入(inject)的组件的类型。下面以依赖ILogger
的类为例:
public class ComponentA : IService
{
public ComponentA(ILogger logger) { ... }
}
以上注册将确保ComponentA
注入(inject)了 Logger<ComponentA>
,即使它仅取决于 ILogger
而不是 ILogger<T>
.
如果以上内容满足您的需要,您可以在此处停止阅读……或者如果您对更可靠的解决方案感兴趣,请继续阅读。
而不是让应用程序组件依赖于框架定义的 ILogger
抽象,您还可以选择定义特定于应用程序的记录器抽象,如 Dependency Inversion Principle 所规定的那样(DIP).
DIP 声明抽象应由应用程序本身定义——这意味着您可以定义自己的 logger abstraction (另请参阅 this 以了解您为什么要这样做的解释)并在此基础上构建一个适配器,就像描述的 here 一样。 .您可以简单地从描述的 MicrosoftLoggingAdapter
派生您的通用适配器。如下:
public sealed class MicrosoftLoggingAdapter<T> : MicrosoftLoggingAdapter
{
public MicrosoftLoggingAdapter(ILoggerFactory factory)
: base(factory.CreateLogger<T>()) { }
}
使用这个通用适配器,您可以按如下方式配置 Simple Injector:
container.RegisterInstance<ILoggerFactory>(factory);
container.RegisterConditional(
typeof(MyApplication.Abstractions.ILogger),
c => typeof(MicrosoftLoggingAdapter<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
_ => true);
关于c# - 简单注入(inject)器 : Register ILogger<T> by using ILoggerFactory. CreateLogger<T>(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243485/
我有记录到 Microsoft.Extensions.Logging.ILogger 的代码(主要是扩展方法)。 我已将 Serilog 配置为实际进行日志记录。 我找不到将 Serilog.ILog
这可能与Pass ILogger or ILoggerFactory to constructors in AspNet Core?有点关系,但是这是专门针对库设计的,而不是关于使用这些库的实际应用程
我一直在尝试将 .net core 库项目引用到我的 Azure 函数项目中,以调用 .net core 类库中定义的进程之一。 .net core 库项目使用 ILogger。 但是,每当我尝试运行
如果类 T 包含对 ILogger 的依赖,则依赖关系已解决: public class Foo { private ILogger _logger; public Foo(ILogg
我已经将 vs 2019 用于控制台应用程序(dotnet core 3.1), Install-Package Microsoft.Extensions.Logging.Console -Versi
使用Microsoft.ApplicationInsights.AspNetCore v2.6.1使用 .net core v2.2.2,我可以看到 Azure Application Insight
我正在尝试在我的 Azure 函数中使用 Serilog.ILogger。我正在设置它,以便我可以添加自定义属性。当我尝试运行 Azure 函数时,会弹出控制台窗口并显示以下错误: [2021-03-
我正在使用 Microsoft.Extensions.Logging (MEL) 中的 ConsoleLoggerProvider 在 .NET 6 控制台应用程序中写入日志。 我希望我的日志包含每个
我正在使用 Microsoft.Extensions.Logging (MEL) 中的 ConsoleLoggerProvider 在 .NET 6 控制台应用程序中写入日志。 我希望我的日志包含每个
这更像是一个架构问题:您是使用 ILogger(并通过 DI 将其传递到构造函数中)还是更喜欢静态类 Log? 我们经常使用 ILogger,但它似乎确实使代码困惑,尤其是当它通过构造函数传递时。如果
我是第 3 方服务的 C# 开源包装器的作者。我需要公开一个 ILogger 工具(例如 https://logging.apache.org/log4net/release/sdk/log4net.
我正在使用 NLog (v2.0) 试用 Ninject 的日志记录扩展 (v3.0),根据我的阅读,我不应该配置任何东西,就像auto-神奇的,我需要做的就是在需要的地方声明一个ILogger 依赖
当我尝试使用 ILogger.LogInformation() 输出带有货币格式说明符的数值时,我得到了一个不同于我使用 Console.Log(string.Format( ))。后者显示预期的美元
我正在未来项目的原型(prototype)中使用 Durable Azure Function。 基本上,我有一个由启动 Orchestrator 的 HTTP POST 请求触发的客户端 Azure
我有一个函数应用程序(版本 2.0)并尝试记录异常的堆栈跟踪。 try { processedOrder = await orderProcessin
请参阅Log unhandled exceptions to custom logger在github上。显然 Up to Preview 2 Blazor 通过 Console.WriteLine
我有一个 ASP.NET Core 2 Web 应用程序正在部署到生产环境,需要启用日志来解决错误。我无法在文档中的任何地方找到 appsettings.json 的记录器部分中的架构。这是我在那里的
我正在实现一个自定义的 Microsoft.Extensions.Logging.ILogger (和 ILoggerProvider。我想检索当前的身份,但我真的不知道,因为我无法注入(inject
我有一个 azure 功能,它可以毫无问题地记录信息。 namespace aspnetcore_azurefun_blob { [StorageAccount("AzureWebJobsSt
我有一个服务,它执行一些 REST API 调用,并且我在 API 调用之前和之后进行自定义日志记录: _logger.LogTrace("Invoked API {ApiName}", new {
我是一名优秀的程序员,十分优秀!