gpt4 book ai didi

c# - CaSTLe Windsor 不会在属性中注入(inject) Logger!

转载 作者:太空狗 更新时间:2023-10-29 20:57:22 25 4
gpt4 key购买 nike

我尝试在我的服务类的 ILogger 属性中注入(inject) log4net,但该属性始终为 NULL!

我看过这个主题,但对我没有帮助!

How can I get Castle Windsor to automatically inject a property?

这是 Program.cs

 CastleContainer.Instance
.Install(
new RepositoriesInstaller(),
new PersistenceInstaller(),
new LoggerInstaller(),
new FormInstaller(),
new ServiceInstaller()

);

FrmStart form1 = CastleContainer.Resolve<FrmStart>(new {Id="666" });

我使用 log4net.config 外部文件,这是我的安装程序:

public class LoggerInstaller : IWindsorInstaller
{
#region IWindsorInstaller Members

public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net, "log4net.config"));
}

#endregion
}

这是包含我希望 Windsor 注入(inject)的属性的类:

public partial class FrmStart : Form
{
private EventService EventService;

private ILogger logger = NullLogger.Instance;
public ILogger Logger
{
get { return logger; }
set { logger = value; }
}

public FrmStart(EventService eventService, string Id)
: this()
{

Logger.Debug("xxx");

this.EventService = eventService;
this.id = Id;
}

注意构造函数中的“eventService”和“Id”注入(inject)正确!如果我尝试在它工作的构造函数中注入(inject) Logger,并且我有 Logger 对象:{log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl}! :-(

我已经尝试为 EventService 创建一个公共(public)属性,Windsor 可以正确地注入(inject)它!所以我认为问题只与 ILogger 接口(interface)有关。

我在这里准备了一个简单的完整代码示例:

using Castle.Core.Logging;
using Castle.Facilities.Logging;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;

namespace IocTest
{


public class LoggerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility("logger", new LoggingFacility(LoggerImplementation.Log4net, "log4net.config"));
}
}
public class LogicInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick()
.If(t => t.Name.StartsWith("Logic"))
.Configure((c => c.LifeStyle.Transient)));
}
}

class Program
{
static void Main(string[] args)
{
IWindsorContainer container = new WindsorContainer();

container.Install(
new LoggerInstaller(),
new LogicInstaller()
);


LogicClass1 logic1 = container.Resolve<LogicClass1>();
LogicClass2 logic2 = container.Resolve<LogicClass2>();
}
}

public class LogicClass1
{
private ILogger logger = NullLogger.Instance;
public ILogger Logger
{
get { return logger; }
set { logger = value; }
}

public LogicClass1()
{
logger.Debug("Here logger is NullLogger!");
}
}

public class LogicClass2
{
public LogicClass2(ILogger logger)
{
logger.Debug("Here logger is properly injected!");
}
}
}

怎么了?

最佳答案

问题是你检查的地方:

 public ILogger Logger
{
get { return logger; }
set { logger = value; }
}

public LogicClass1()
{
logger.Debug("Here logger is NullLogger!");
}

在构造函数运行之后之前不会发生属性注入(inject),因此在构造函数中检查属性值永远不会显示您期望的值

关于c# - CaSTLe Windsor 不会在属性中注入(inject) Logger!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872131/

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