Castle Windsor不能在属性中注入Logger

本文关键字:注入 Logger 属性 Windsor 不能 Castle | 更新日期: 2023-09-27 17:54:20

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

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

如何让Castle Windsor自动注入属性?

this is Program.cs

 CastleContainer.Instance
        .Install(
          new RepositoriesInstaller(),
          new PersistenceInstaller(),
          new LoggerInstaller(),
          new FormInstaller(),
          new ServiceInstaller()
          );
        FrmStart form1 = CastleContainer.Resolve<FrmStart>(new {Id="666" });

我使用log4net。配置外部文件,这是我的安装程序:

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注入的属性:

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"answers"Id"是正确注入的!如果我尝试在构造函数中注入Logger,它会工作,并且我有Logger对象:{log4net.Repository.Hierarchy.DefaultLoggerFactory + LoggerImpl} !: - (

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

我在这里准备了一个简单的完整代码示例:
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!");
    }
}
}

怎么了?

Castle Windsor不能在属性中注入Logger

问题是你在哪里检查它:

 public ILogger Logger
    {
        get { return logger; }
        set { logger = value; }
    }
    public LogicClass1()
    {
        logger.Debug("Here logger is NullLogger!");
    }

属性注入不会发生,直到构造函数之后的运行,所以检查构造函数中的属性值永远不会显示您期望的值

我也有同样的问题。始终是null

我设法通过在构造函数中注入记录器来解决这个问题:
public ILogger logger;
public MyController(ILogger logger)
{
    this.logger = logger;
    logger.Info("Something");
}

您还可以使用以下命令初始化Logger:

public ILogger Logger { get; set; }
public MyController()
{
     Logger = NullLogger.Instance;
}