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

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

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

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

这是Program.cs

CastleContainer.Instance .Install( new RepositoriesInstaller(), new PersistenceInstaller(), new LoggerInstaller(), new FormInstaller(), new ServiceInstaller() ); FrmStart form1 = CastleContainer.Resolve(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注入的属性:

 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”已正确注入! 如果我尝试在构造函数中注入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(); LogicClass2 logic2 = container.Resolve(); } } 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!"); } 

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

我遇到了同样的问题。 它总是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; }