Castle Windsor不会在物业中注入Logger!

dan*_*iax 6 c# log4net castle-windsor inversion-of-control

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

我已经看过这个话题,但它对我没有帮助!

如何让Castle Windsor自动注入房产?

这是Program.cs

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

          );

        FrmStart form1 = CastleContainer.Resolve<FrmStart>(new {Id="666" });
Run Code Online (Sandbox Code Playgroud)

我使用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
}
Run Code Online (Sandbox Code Playgroud)

这个类包含我想要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;
    }
Run Code Online (Sandbox Code Playgroud)

请注意,构造函数中的"eventService"和"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!");
    }
}
}
Run Code Online (Sandbox Code Playgroud)

怎么了?

Phi*_*eck 14

问题是你在检查它:

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

    public LogicClass1()
    {
        logger.Debug("Here logger is NullLogger!");
    }
Run Code Online (Sandbox Code Playgroud)

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