c# - 将 Windsor Logging Facility 安装到图书馆中

标签 c# logging dependency-injection inversion-of-control castle-windsor

我正在开发一个框架,我在其中放置了大量日志记录。我通过这个属性模式使用了 CaSTLe Windsor 的 ILogger:

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

此项目随后被其他项目引用。例如,在测试项目中,我将首先安装记录器来构建测试。我使用我所有长时间运行的测试扩展的抽象类来执行此操作:

namespace Framework.Test
{
    public abstract class Log4NetLoggedTest
    {
        private const string ConfigFilePath = "log4net.config";
        protected ILogger Logger { get; set; }
        protected IWindsorContainer Container { get; set; }

        protected Log4NetLoggedTest()
        {
            Container = new WindsorContainer();

            Container.Install(new LoggerInstaller(ConfigFilePath));

            Logger = Container.Resolve<ILogger>();
        }

        ~Log4NetLoggedTest()
        {
            Container.Dispose();
        }
    }
}

所以我的测试看起来像这样:

namespace Framework.Test
{
    [TestFixture]
    public class MyLongRunningTest : Log4NetLoggedTest
    {
        [Test]
        [Category("LongRunning")]
        public void ModelConvergesForS50()
        {
            Logger.Info("Starting test...");

            var obj = new SomeClass();
            obj.DoSomething();

            // ...
        }
    }
}

测试的 ILogger Logger 得到正确解析和设置,所以在这个例子中我得到“开始测试...”而不是“正在做某事”。 SomeClass 的 ILogger 保持为 NullLogger。

请帮忙!

最佳答案

您正在使用“new”实例化 SomeObj 而不是通过容器。如果不通过容器,它无法注入(inject)依赖

关于c# - 将 Windsor Logging Facility 安装到图书馆中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8341018/

相关文章:

c# - ASP .Net Core 中静态方法的依赖注入(inject)

c# - 先EF数据库,重命名实体表名

C# 程序使用的用户字符串的组合长度超过了允许的限制。尝试减少字符串文字的使用

xcode - 在运行时打印调用堆栈(XCode)

c# - 强制执行特定数量的参数

dependency-injection - bundle 中的蓝图依赖注入(inject)

c# - Global.asax.cs 和静态变量

c# - 使用 web.config 进行 Unity 配置

Azure V3函数登录另一个类库

PHP 依赖注入(inject)。我这里的代码实际上是依赖注入(inject)容器吗?