加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何将依赖项传递给自定义.NET Core ILoggerProvider

发布时间:2020-12-16 01:27:09 所属栏目:百科 来源:网络整理
导读:我正在创建一个自定义的.NET Core ILoggerProvider,它需要将一些依赖项传递给它的构造函数. 我相信我使用一种相当常见的模式来初始化我的日志记录实现;它看起来像这样: var services = new ServiceCollection();// Register some services hereservices.Add
我正在创建一个自定义的.NET Core ILoggerProvider,它需要将一些依赖项传递给它的构造函数.

我相信我使用一种相当常见的模式来初始化我的日志记录实现;它看起来像这样:

var services = new ServiceCollection();

// Register some services here

services.AddLogging(builder =>
{
    builder.AddProvider(new DebugLoggerProvider());
});

var provider = services.BuildServiceProvider();

我想在AddLogging块中添加我的新提供程序,就像当前添加DebugLoggerProvider一样.

我的自定义提供程序需要将一些其他服务传递给它的构造函数,因为这些服务已经在ServiceCollection中注册,我假设我应该能够引用它们.但是,与AddSingleton等具有暴露IServiceProvider的重载的方法不同,AddLogging似乎不提供等价物.

有没有一种简单的方法来实现这一点,或者我是否尝试做一些与.NET Core日志设计部署方式相矛盾的事情?

更新:

在尝试了@Nkosi提出的建议之后,我可以确认通过绕过AddLogging并直接实现其内部实现,可以使其工作,如下所示:

var services = new ServiceCollection();

// Register some services
services.AddSingleton<IMyService,MyService>();

// Initialize logging
services.AddOptions();
services.AddSingleton<ILoggerFactory,LoggerFactory>();
services.AddSingleton(typeof(ILogger<>),typeof(Logger<>));
services.AddSingleton<ILoggerProvider>(p => new DebugLoggerProvider());
services.AddSingleton<ILoggerProvider>(p => new MyLoggerProvider("Constant value",p.GetService<IMyService>()));

var provider = services.BuildServiceProvider();

解决方法

现在我不确定是否已经存在扩展但是我在这里看到了潜力.

首先,这是在源代码仓库中定义AddProvider的方式.

public static ILoggingBuilder AddProvider(this ILoggingBuilder builder,ILoggerProvider provider) {
    builder.Services.AddSingleton(provider);
    return builder;
}

您可以通过制作自己的通用版本来构建它

public static class MyLoggingBuilderExtensions {
    public static ILoggingBuilder AddProvider<T>(this ILoggingBuilder builder)
        where T: class,ILoggerProvider{
        builder.Services.AddSingleton<ILoggerProvider,T>();
        return builder;
    }
}

这应该允许DI容器在解析时建立对象图

services.AddLogging(builder =>
{
    builder.AddProvider<CustomLoggerProvider>();
});

并且还有扩展此功能的空间,例如添加自己的重载,公开IServiceProvider并将其传递给扩展中的AddSingleton.

public static ILoggingBuilder AddProvider<T>(this ILoggingBuilder builder,Func<IServiceProvider,T> factory)
    where T: class,ILoggerProvider {
    builder.Services.AddSingleton<ILoggerProvider,T>(factory);
    return builder;
}

并使用

services.AddLogging(builder => {
    builder.AddProvider<CustomLoggerProvider>(p => new CustomLoggerProvider("Constant value",p.GetService<IMyService>()));
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读