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; }