gpt4 book ai didi

logging - 在 DryIoc 容器中注册 ILoggerFactory

转载 作者:行者123 更新时间:2023-12-02 01:03:46 29 4
gpt4 key购买 nike

我想将 Microsoft.Extensions.Logging 与 DryIoc 容器一起使用。

默认方式是将工厂注册为实例,注入(inject)并创建记录器:

ILoggerFactory loggerFactory = new LoggerFactory().AddDebug();
container.RegisterInstance(loggerFactory);

// inject factory in constructor
public MyService(ILoggerFactory loggerFactory){
this.logger = loggerFactory.CreateLogger<MyService>()

this.logger.LogInformation("Logger created");
}

但我想要一个更像 ASP.NET Core 的行为,直接注入(inject) Logger:
// inject logger in constructor
public MyService(ILogger<MyService> logger){
this.logger = logger;

this.logger.LogInformation("Logger created");
}

因此,由于某些配置,我需要创建 ILoggerFactory 的实例,并且 ILogger<> 接口(interface)必须在请求时使用“CreateLogger”方法在容器中注册。

我尝试使用来自 https://bitbucket.org/dadhi/dryioc/wiki/SelectConstructorOrFactoryMethod 的工厂方法进行注册没有任何成功。

结束了这样的事情,但 CreateLogger<> 中的泛型缺失:
container.Register(typeof(ILogger<>), made: Made.Of(() => loggerFactory.CreateLogger<>()));

也许任何人都可以提供帮助。

编辑

您必须这样做才能获得正确的工厂方法:
var loggerFactoryMethod = typeof(LoggerFactoryExtensions).GetMethod("CreateLogger", new Type[] { typeof(ILoggerFactory) });

我在 github.com/dernippel/PrismNetCoreLoggingApp 使用 Xamarin.Forms(带有 Prism 和 DryIoc)创建并更新了一个工作示例。

最佳答案

这是基于 的完整工作示例 sample 接口(interface)和类。
直播代码是here .

using System;
using DryIoc;

public class Program
{
public static void Main()
{
var container = new Container();

// note usage of UseInstance instead of obsolete RegisterInstance
container.UseInstance(new LoggerFactory());

var loggerFactoryMethod = typeof(LoggerFactory).GetMethod("CreateLogger");

container.Register(typeof(ILogger<>), made: Made.Of(
req => loggerFactoryMethod.MakeGenericMethod(req.Parent.ImplementationType),
ServiceInfo.Of<LoggerFactory>()));

container.Register<MyService>();

container.Resolve<MyService>();
}

class MyService
{
public MyService(ILogger<MyService> logger) { logger.Log("Hey!"); }
}

interface ILogger<T>
{
void Log(string msg);
}

class ConsoleLogger<T> : ILogger<T>
{
public void Log(string msg) { Console.WriteLine(typeof(T) + ": " + msg); }
}

class LoggerFactory
{
public ILogger<T> CreateLogger<T>() { return new ConsoleLogger<T>(); }
}
}

静态 LoggerFactoryExtensions 的更新

对于静态方法,设置更简单,您无需通过 ServiceInfo.Of<LoggerFactory>() 指定工厂实例,它将作为任何其他参数注入(inject)。

这是更改( live sample is updated):
    var loggerFactoryMethod = typeof(LoggerFactoryExtensions).GetMethod("CreateLogger");

container.Register(typeof(ILogger<>), made: Made.Of(
req => loggerFactoryMethod.MakeGenericMethod(req.Parent.ImplementationType)));

鉴于扩展:
public static class LoggerFactoryExtensions
{
public static ILogger<T> CreateLogger<T>(this LoggerFactory f) { return new ConsoleLogger<T>(); }
}

关于logging - 在 DryIoc 容器中注册 ILoggerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48911710/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com