gpt4 book ai didi

log4net - 将 LogManager.GetLogger 与 Unity 结合使用

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

鉴于此类:

class Foo
{
readonly ILog log;

public Foo(ILog log)
{
this.log = log;
}

...
}

我想配置 Unity 以注入(inject) ILog。这很简单:

container.RegisterInstance<ILog>(LogManager.GetLogger(typeof(XYZ)));

但我想让 Unity 调用 LogManager.GetLogger 并解析父类型的类型。

这很接近:

container.RegisterType<ILog>(new InjectionFactory((c, t, s) => LogManager.GetLogger(t)));

但在本例中,t 是正在解析的类型 (ILog),而不是正在解析的对象的类型 (Foo )。

我知道我能做到:

container.RegisterType<Foo>(new InjectionFactory(c => new Foo(LogManager.GetLogger(typeof(Foo)));

但我不想每次注册对象时都添加那个疯狂的声明。

我知道这可以在 Autofac 中完成,而且我知道真正的答案不是首先使用 Unity,但这可以完成吗? :)

最佳答案

Unity 可能无法为您提供其他一些容器提供的所有好处,但我还没有找到您无法轻松添加的功能。

var container = new UnityContainer();
container.AddNewExtension<TrackingExtension>();
container.RegisterType<ILog>(
new InjectionFactory((ctr, type, name) =>
{
var tracker = ctr.Resolve<ITracker>();
var parentType = tracker.CurrentBuildNode.Parent.BuildKey.Type;
return LogManager.GetLogger(parentType);
}));
var sut = container.Resolve<UsesLog>();
Assert.AreEqual(typeof(UsesLog), sut.Log.Type);

您可以找到 TrackingExtension 的源代码 here 。它位于 TecX.Unity 项目文件夹中。

关于log4net - 将 LogManager.GetLogger 与 Unity 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8576842/

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