【问题标题】:Determine which class or assembly instantiated an object with Castle Windsor container确定哪个类或程序集使用 Castle Windsor 容器实例化了一个对象
【发布时间】:2014-10-21 12:20:35
【问题描述】:

我使用最新的 Castle Windsor 容器,我想创建一个记录器,它会写入我想要的文件,但也会写入调用方程序集名称。所以这里是一个例子:

namespace Core.Datalayer
{
    public class Foo
    {
       public Foo(ILogger logger)
       {
          logger.Write("test line");
       }
    }
}

容器正确地给出了实例,但我不知道如何确定调用程序程序集名称或调用程序类名称?我希望记录器写入这样的文件:

“组装Core.Datalayer-测试线”

是否有可能确定 ILogger 接口的实例化位置?

我尝试了 Assembly.GetCallingAssembly(),但始终是 Castle.Core,因为堆栈中充满了 Castle.Core 调用。

【问题讨论】:

  • 您使用的是哪个日志框架? log4net、nlog 还是别的什么?
  • 我不使用任何框架来记录它只是一个简单的记录器。我直接将文本写入文件。
  • 大多数主要的日志框架都内置了这个或类似的功能。我真的推荐使用一个!
  • 我同意使用日志框架更简单更好。我仍然试图回答如何用温莎做到这一点。

标签: c# .net castle-windsor


【解决方案1】:

您可以使用子依赖解析器。我认为下面的代码应该适合你。

public class Logger
{
    public Logger(string name)
    {
    }
}

public class LogResolver : ISubDependencyResolver
{
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model,
                           DependencyModel dependency)
    {
        return dependency.TargetType == typeof(Logger);
    }

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model,
                          DependencyModel dependency)
    {
        return new Logger(model.Name);
    }
}

使用

将记录器安装到容器中
container.Kernel.Resolver.AddSubResolver(new LogResolver());

【讨论】:

  • 非常感谢!我挣扎了将近一天。这就是我想要的! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多