如何使用 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 解析正确的记录器类型? 的相关文章

随机推荐

  • 如何将以前版本的 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