背景
在Serilog被选为记录器的新项目中,我自动开始绕过ILogger界面.代码访问Log.Logger一次,从那时起,希望日志记录的类ILogger通过构造函数注入接受.
我受到了这种做法的挑战,建议是在Log课堂上使用静态方法,例如Serilog.Log.Debug(...).这个论点是,有一set;对Log.Logger如此嘲讽是很容易.
看看api,我可以看到传递的好处之一ILogger就是ForContext方法.
我花了一些时间在网上和Serilog的文档中,但是我找不到有关在整个应用程序代码中访问日志的规范方法的信息.
题
是否存在规范的,即大多数情况下更好的方式来访问/传递Serilog记录器,如果存在,是否ILogger在Serilog.Log类上传递或使用静态API ?
我想将属性渲染器实现为处理程序。我在应用程序中使用 Autofac 作为 DI 容器。如何在不使用全局可访问容器(服务位置)的情况下获取在 HtmlHelper 扩展中实现 IPropertyHandler 的对象?是否可以在 Autofac 中注册自己的 HtmlHelper?也许MVC框架提供了另一种方式?
public static class HtmlHelperExtensions {
public static MvcHtmlString Editor(this HtmlHelper html, object model) {
return new Renderer(new List<IPropertyHandler>() /*Where to get these objects?*/ ).Render(html, model);
}
}
public class Renderer {
private readonly ICollection<IPropertyHandler> _propertyRenderers;
public Renderer(ICollection<IPropertyHandler> propertyRenderers) {
_propertyRenderers = propertyRenderers;
}
public MvcHtmlString Render(HtmlHelper html, object model) {
var result = "";
foreach(var prop in model.GetType().GetProperties()) {
var renderers = _propertyRenderers.OrderBy(b => b.Order);
//impl
}
return …Run Code Online (Sandbox Code Playgroud) 我仍然没有\xe2\x80\x99t 依赖注入,并且我\xe2\x80\x99m 是新的.Net Core(使用3.1.5)。我\xe2\x80\x99已经为WebAPI创建了一个AuthorizationFilter。我\xe2\x80\x99m 仍然不明白的是如何将我的 Nlog 传递给属性。
\n我有以下内容作为我的 AuthorizaitonFilter
\npublic class TokenAttribute : Attribute, IAuthorizationFilter\n {\n private readonly ILogger _logger;\n\n public TokenAttribute(ILogger logger)\n {\n _logger = logger;\n }\n\n public void OnAuthorization(AuthorizationFilterContext context)\n {\n _logger.LogInformation("Authorizing");\n\n //Get the values from the Request Header\n context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n //Query to look up Customer and Token\n\n using (var ctx = new ModelContext())\n {\n var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n if (results == null || results.Count == 0)\n {\n context.Result = …Run Code Online (Sandbox Code Playgroud)