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

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

概述我正在创建一个自定义的.NET Core ILoggerProvider,它需要将一些依赖传递给它的构造函数. 我相信我使用一种相当常见的模式来初始化我的日志记录实现;它看起来像这样: var services = new ServiceCollection();// Register some services hereservices.AddLogging(builder =>{ 我正在创建一个自定义的.NET Core ILoggerProvIDer,它需要将一些依赖项传递给它的构造函数.

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

var services = new ServiceCollection();// Register some services hereservices.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 servicesservices.AddSingleton<IMyService,MyService>();// Initialize loggingservices.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>()));});
总结

以上是内存溢出为你收集整理的c# – 如何将依赖项传递给自定义.NET Core ILoggerProvider全部内容,希望文章能够帮你解决c# – 如何将依赖项传递给自定义.NET Core ILoggerProvider所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1230176.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存