gpt4 book ai didi

asp.net - 如何从 ASP.NET Core 中的 Controller 以外的其他类登录?

转载 作者:行者123 更新时间:2023-12-03 23:25:49 26 4
gpt4 key购买 nike

ASP.NET Core 内置了对日志记录的支持,但文档指出应该通过请求 ILogger 来完成日志记录。通过依赖注入(inject),即将它作为参数添加到 Controller构造函数。

使用 ILogger 在我的代码中污染方法签名或构造函数对于这个跨领域的关注点,争论感觉像是错误的解决方案。在 Android 中,Log类是静态的,这使得从代码的任何部分进行日志记录变得微不足道。

从 Controller 以外的其他地方进行日志记录的好方法是什么?

最佳答案

关于在任何组件中使用日志记录:

Adding logging to a component in your application is done by requesting either an ILoggerFactory or an ILogger<T> via Dependency Injection. If an ILoggerFactory is requested, a logger must be created using its CreateLogger method.



如果您的 CustomClass是一个数据容器(DTO 类),它不应该知道日志记录,而只是包含数据。

对于其他名称如“Service”、“Provider”、“Handler”等的类,最佳实践是使用依赖注入(inject)来解析实例。通常,您应该尽可能使用 DI,因为它是一种实现对象与其协作者或依赖项之间松散耦合的技术。有关更多信息,以下问题可能会很有趣: Should I use Dependency Injection or static factories?

所以只需添加 ILogger<CustomClass>到它的构造函数(实际上和 Controller 一样),因为 .NET Core 默认只支持构造函数注入(inject):
public class CustomClass
{
private readonly ILogger _logger;

public CustomClass(ILogger<CustomClass> logger)
{
_logger = logger;
}
}

ASP.NET Core 内置的依赖注入(inject)容器会自动解析 transient 依赖。所以如果你的 Controller 有类 A作为使用类 B 的依赖项在你想记录一些东西的地方,你的代码可以是这样的:
public class MyController
{
public MyController(ClassA classA)
{ ... }
}

public class ClassA
{
public ClassA(ClassB classB)
{ ... }
}

public class ClassB
{
private readonly ILogger _logger;

public ClassB(ILogger<ClassB> logger)
{
_logger = logger;
}

public void DoSomethingWithLogging()
{
// use _logger
}
}

请注意,您还需要在 Startup 中注册依赖项。使用 IServiceCollection.Add…方法:
public void ConfigureServices(IServiceCollection services)
{
// ...

services.AddTransient<ClassB>();
services.AddTransient<ClassA>();
}

内置日志记录支持意味着开箱即用的 .NET Core 知道并正在使用内置抽象进行日志记录。这主要由 ILoggerFactory 完成。和 ILoggerProvider接口(interface)。
/// <summary>
/// Represents a type used to configure the logging system and create instances of <see cref="ILogger"/> from
/// the registered <see cref="ILoggerProvider"/>s.
/// </summary>
public interface ILoggerFactory : IDisposable

// <summary>
/// Represents a type that can create instances of <see cref="ILogger"/>.
/// </summary>
public interface ILoggerProvider : IDisposable

使用您自己的 ILoggerProvider实现,你可以添加你自己的记录器,它可以做任何你想做的事情。您可以查看 NLog记录器实现作为工作示例。

感谢 ILoggerFactory ,您可以简单地为项目特定目的配置您的 Logger:

To configure logging in your ASP.NET Core application, you should resolve ILoggerFactory in the Configure method of your Startup class. ASP.NET Core will automatically provide an instance of ILoggerFactory using Dependency Injection when you add a parameter of this type to the Configure method.

关于asp.net - 如何从 ASP.NET Core 中的 Controller 以外的其他类登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39031585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com