如何使用 AutoFac 解析正确的记录器类型?

2023-11-23

我正在更新一个使用 AutoFac 的遗留项目,并且我想将 NLog 与 Simple Logging Facade (SLF) 结合使用

我过去曾在 Ninject 中使用过它,它的设置非常简单,我只需要执行以下操作:

kernel.Bind<ILogger>().ToMethod(x => LoggerFactory.GetLogger(x.Request.Target.Member.ReflectedType));

输出将类似于:

NLogNinjectSlf.Services.MyService2013-12-30 15:21:10.5782 从注入的记录器调试日志

小菜一碟

但现在我必须使用 AutoFac 并且我不知道如何获取目标类型需要记录器

例如,如果我有以下接口/类:

public interface IMyService
{
    void DoSomething();
}

public class MyService : IMyService
{
    private readonly ILogger _logger;

    public MyService(ILogger logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        _logger.Debug("Log from injected Logger");
    }
}

我希望能够获得以下类型MyService类将其用作我的记录器的名称

在 AutoFac 中,这是我迄今为止尝试过的:

var containerBuilder = new ContainerBuilder();

containerBuilder.RegisterType<MyService>().As<IMyService>();

containerBuilder.Register(x =>
{
    // TODO: Get the correct type
    return LoggerFactory.GetLogger(x.GetType());
}).As<ILogger>();

顺便说一句:我在 SLF4Net 后面使用 NLog 并不是真正需要解决主要问题......


Thanks nemesv这对我有很大帮助

这是我最终使用的代码

顺便提一句。如果您愿意,您可以删除注入属性的代码,然后在所有类中使用 DI 来注入ILogger这会提高性能

public class LoggingModule : Module
{
    protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry,
        IComponentRegistration registration)
    {
        registration.Preparing += OnComponentPreparing;

        registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
    }

    private static void InjectLoggerProperties(object instance)
    {
        var instanceType = instance.GetType();

        // Get all the injectable properties to set.
        // If you wanted to ensure the properties were only UNSET properties,
        // here's where you'd do it.
        var properties = instanceType
          .GetProperties(BindingFlags.Public | BindingFlags.Instance)
          .Where(p => p.PropertyType == typeof(ILogger) && p.CanWrite && p.GetIndexParameters().Length == 0);

        // Set the properties located.
        foreach (var propToSet in properties)
        {
            propToSet.SetValue(instance, LoggerFactory.GetLogger(instanceType), null);
        }
    }

    private void OnComponentPreparing(object sender, PreparingEventArgs e)
    {
        var t = e.Component.Activator.LimitType;

        e.Parameters = e.Parameters.Union(
            new[]
            {
                new ResolvedParameter((p, i) => p.ParameterType == typeof (ILogger),
                    (p, i) => LoggerFactory.GetLogger(t))
            });
    }
}

然后注册模块:

containerBuilder.RegisterModule<LoggingModule>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 AutoFac 解析正确的记录器类型? 的相关文章

  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • MVC Core IActionResult 含义

    什么是IActionResult 我尝试查看 MSDN 和其他网站 但需要通用 常见 易于理解的答案 MSDN IActionResult https learn microsoft com en us dotnet api microso
  • 为什么在 C# 中成员初始值设定项中不允许这样做,但在 VB.Net Me 中允许

    我正在将 VB Net 应用程序转换为 C 并注意到在 VB Net 代码中 有一个私有成员变量 它是使用Me像这样 Private m ClassA As New MyCollection Of ClassA Me 当我将其转换为 C 代
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • 如何在 MFC 中调整对话框大小时移动控件?

    我已经在 MFC 中创建了对话框视图 从下图中可以清楚地看到 如滑块控件和编辑框等 当我调整对话框大小时 这些控件不会移动 在此输入图像描述 https i stack imgur com 7OxAK jpg 我想移动控件以适应对话框 但不
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • Azure 2012 年 10 月 SDK 损坏 UseDevelopmentStorage=true

    有人尝试过使用 usedevelopmentstorage true 连接字符串的 2012 年 10 月 Azure sdk 吗 CloudStorageAccount Parse UseDevelopmentStorage true 抛
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString

随机推荐

  • 如何将以前版本的 Python 安装到 virtualenv 中? [复制]

    这个问题在这里已经有答案了 我在全局安装了Python3 然后创建了一个virtualenv 现在我想把里面的python版本改成Python2 7 尝试安装Python2 7时我只能选择安装到我的硬盘上 如何指定 virtualenv 中
  • Nhibernate 标准:“选择 max(id)...”

    我可以使用 Criteria 执行 t sql 命令来选择表中列的最大值吗 从客户中选择 cus id max id 1 Ta Ollie Use 投影 session CreateCriteria typeof Customer SetP
  • 实例作为静态类属性

    是否可以在 PHP 中将类的实例声明为属性 基本上我想要实现的是 abstract class ClassA static property new ClassB 好吧 我知道我不能这样做 但是除了总是做这样的事情之外还有什么解决方法吗 i
  • Reactjs 可以以编程方式处理 :before 吗?

    我必须以某种方式以编程方式设置宽度 before for a div div div 我如何定义someStyle这样的宽度 before of something div可以相应改变吗 是的 您可以通过编程方式更改 React 中的 be
  • 如何使用 Indy 10 和 OpenSSL 通过 HTTPS 下载文件?

    我有以下任务 使用 HTTPS 和身份验证下载文件 Indy 似乎是可行的方法 但由于某种原因它到目前为止还不起作用 我已做好以下准备 我用于下载的 TIdHTTP 组件 用于创建 URL 的 TIdURI 组件 应提供安全连接的 TIdS
  • 如何针对多个验证组进行验证?

    我有两个验证组 父组和子组 我有一个添加按钮 只需验证子验证组 这很容易完成 保存按钮需要针对客户端和服务器端的父验证组和子验证组进行验证 我想我知道如何通过为每个组调用 Page Validate groupname 方法来在服务器端完成
  • 使用 C# 中的 .Pem/.Pkcs8 密钥文件中的 MD5WithRSA 对数据进行签名

    我有以下 Java 代码示例 我需要在 C 中重新制定它 PKCS8EncodedKeySpec privKeySpec new PKCS8EncodedKeySpec pkcs8PrivateKey KeyFactory keyFacto
  • clang 和 gcc 之间 const 引用三元运算符的地址差异

    我对这里发生的事情有一个模糊的想法 这与this但我想知道为什么 clang 和 g 处理这个问题的方式不同 这里未定义的行为在哪里 注意 这与模板无关 我只是使用它们来使示例更加紧 凑 这都是关于类型的whatever include
  • 实用程序类是邪恶的吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我看到这个问题 如果 实用程序 类是邪恶的 我该将通用代码放在哪里 我想 为什么实用程序类是邪恶的 假设我有一个深度为数十个类的领域模型 我需要能够对实例进行 xml 化 我是否在父级上创
  • 为什么 for_each 不能修改其函子参数?

    http www cplusplus com reference algorithm for each 一元函数取一个元素 范围作为参数 这可以 是一个指向函数或 其类重载的对象 操作员 它的返回值 如果有的话 被忽略 根据这篇文章 我预计
  • 整数除法返回 0

    我觉得我错过了一些明显的东西 我正在尝试测试的分布random 这是表格 create table test id int random float float random int int 这是我想做的 truncate table te
  • Sphinx HTML 输出的搜索功能的不同 URL 参数有何影响?

    Sphinx 生成的 HTML 文档包括一个搜索界面 例如 在 Python 官方文档中搜索术语 popen 时 将构造以下 URL 不同的 URL 参数有什么影响 Sphinx 生成的 HTML 文档的搜索执行完全基于 JavaScrip
  • 出现滚动条时 FireFox 中的长页面偏移

    在 Firefox 和 Safari 中 当页面足够长以显示滚动条时 居中的页面会移动几个像素 如果您浏览一个具有长页面和短页面的网站 页面似乎会 跳跃 IE7 倾向于让滚动条始终可见 但在页面不够长时将其禁用 由于 HTML 窗口的宽度永
  • Symfony 4 - KnpPaginator Bundle“找不到服务,即使它存在于应用程序的容器中”

    我一直在关注教程 所有说明都显示它是以完全相同的方式完成的 但它似乎在 Symfony 4 中不起作用 是否有我忽略的东西 或者捆绑包根本不兼容 I ran composer require knplabs knp paginator bu
  • 如何使用 jest 和 React 测试库测试调用提交表单的按钮

    所以我试图测试 onSubmit 函数是否在单击按钮时被触发 我这样做的方式是通过测试 onSubmit 函数的内部正在获取调用 axios post 方法 the test describe RecipeSearch gt test su
  • 关于Android中SQLite数据库游标的几个问题

    为了在我的应用程序中实现数据库访问 我遵循拉尔斯 沃格尔教程 但我对一些事情感到非常困惑 每次拨打电话时fetchTodo将创建并返回一个新游标 将前一个光标留给垃圾收集器 所以 如果我不使用startManagingCursor甚至是Cu
  • Android 应用程序中的 API 密钥等敏感全局信息存储在哪里?

    我需要在 Android 应用程序中存储一些敏感信息 如果我将其放入资源文件中 则其他应用程序只需使用以下命令即可浏览和读取该文件似乎是微不足道的PackageManager getResourcesForApplication 放置此类信
  • sqlalchemy,用DSN指定数据库名称

    我正在尝试使用以下命令从 Linux 连接到 SQL Serversqlalchemy 这一页显示基于 DSN 的连接 如下所示 engine create engine mssql pyodbc scott tiger some dsn
  • 如何让 PHP 回显 XML 标签?

    我正在开发一个具有大约 3 000 4 000 个动态生成页面的网站 并且我希望更新 XML 站点地图 我过去曾尝试使用在线生成器 但它们似乎从未正确捕获所有页面 所以我打算自己做一些事情 基本上我有类似的东西
  • 如何使用 AutoFac 解析正确的记录器类型?

    我正在更新一个使用 AutoFac 的遗留项目 并且我想将 NLog 与 Simple Logging Facade SLF 结合使用 我过去曾在 Ninject 中使用过它 它的设置非常简单 我只需要执行以下操作 kernel Bind