C# 将Windsor日志记录设施安装到库中
我正在开发一个框架,在这个框架中我放了很多日志。我使用了温莎城堡的ILogger,通过以下属性模式:C# 将Windsor日志记录设施安装到库中,c#,logging,dependency-injection,inversion-of-control,castle-windsor,C#,Logging,Dependency Injection,Inversion Of Control,Castle Windsor,我正在开发一个框架,在这个框架中我放了很多日志。我使用了温莎城堡的ILogger,通过以下属性模式: namespace Framework { public class SomeClass { private ILogger _logger = NullLogger.Instance; public ILogger Logger { get { return _logger; } s
namespace Framework
{
public class SomeClass
{
private ILogger _logger = NullLogger.Instance;
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public void DoSomething()
{
Logger.Info("Doing something.");
}
//...
}
}
我还提供了框架内的安装程序:
namespace MyFramework
{
public class LoggerInstaller : IWindsorInstaller
{
private readonly string _configPath;
public LoggerInstaller(string configPath)
{
_configPath = configPath;
}
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net, _configPath));
//I've also tried this one:
//container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net).WithConfig(_configPath));
}
}
}
测试的ILogger得到正确的解析和设置,因此在本例中,我得到的是“开始测试…”,而不是“做点什么”。SomeClass的ILogger保持为NullLogger
请帮忙 我可能在说一些愚蠢的话,但不应该是这样的:
namespace Framework.Test
{
[TestFixture]
public class MyLongRunningTest : Log4NetLoggedTest
{
[Test]
[Category("LongRunning")]
public void ModelConvergesForS50()
{
Logger.Info("Starting test...");
var obj = new SomeClass();
obj.Logger = Logger;
obj.DoSomething();
// ...
}
}
}
我看不到您在任何地方应用您在类中使用的记录器实例 您正在用“new”实例化SomeObj,而不是遍历容器。如果不遍历容器,它就无法注入可以在构造函数中使用的依赖项。SomeClass(Logger)日志记录是一个交叉关注点,因此您不必手动执行构造函数或属性注入:请参阅。这就是温莎城堡伐木设施的全部要点
namespace Framework.Test
{
[TestFixture]
public class MyLongRunningTest : Log4NetLoggedTest
{
[Test]
[Category("LongRunning")]
public void ModelConvergesForS50()
{
Logger.Info("Starting test...");
var obj = new SomeClass();
obj.DoSomething();
// ...
}
}
}
namespace Framework.Test
{
[TestFixture]
public class MyLongRunningTest : Log4NetLoggedTest
{
[Test]
[Category("LongRunning")]
public void ModelConvergesForS50()
{
Logger.Info("Starting test...");
var obj = new SomeClass();
obj.Logger = Logger;
obj.DoSomething();
// ...
}
}
}