Castle Windsor - 传递类型作为构造函数参数
我有一个类需要Type
作为构造函数参数。我如何在Windsor容器中注册?Castle Windsor - 传递类型作为构造函数参数
public Class NLogLogger : ILogger
{
private NLog.Logger _logger;
public NLogLogger(Type type)
{
_logger = NLog.LogManager.GetLogger(type.FullName);
}
...
}
我想这种方式进行注册:
container.Register(Component.For(typeof(ILogger))
.ImplementedBy(typeof(NLogLogger))
.LifestyleTransient()
.DependsOn(new Hashtable
{
{"type", ???}
}));
我需要填写???
。我无法弄清楚如何在那里传递呼叫班的Type
。
更新
通过您的更新去要注入的类型,这样就可以用它来记录。有两种解决方案。
public class ClassDependentOnLogger
{
private ILogger _logger;
public ClassDependentOnLogger(ILogger logger)
{
_logger = logger;
}
....
}
1 - 使用温莎SubDependancyResolver。下面的例子演示了如何恢复和ILog的实例,但你可以很容易地适应它返回一个类型,而不是如果这是你想做的事:
public class LoggerResolver : ISubDependencyResolver
{
private readonly IKernel kernel;
public LoggerResolver(IKernel kernel)
{
this.kernel = kernel;
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, Castle.Core.ComponentModel model, DependencyModel dependency)
{
return NLog.LogManager.GetLogger(model.Implementation.FullName);
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, Castle.Core.ComponentModel model, DependencyModel dependency)
{
return dependency.TargetType == typeof(ILogger);
}
}
//Register the sub dependency resolver. This looks cleaner if you do it via a
//Facility but that's a whole other class
Container.Kernel.Resolver.AddSubResolver(new LoggerResolver(Kernel));
2 - 使用温莎LoggingFacility
有不需要你的例子中描述的NLoggerClass。
@ user1178376我已经发现我们出错的地方我错过了关于被称为NLogLogger的类并从ILogger继承的全部内容,我归类到这个类,并且认为这是一个依赖于注入类型的类它自己的记录器。基本上你想要做的是创建一个SubDependencyResolver,这是我给你的,但现在我已经重读了这一切都是有道理的问题。 – Bronumski 2012-03-21 21:53:08
@ user1178376对不起,它迟到了,我犯了愚蠢的错误。当我从我们的具体实现中删除逻辑时,我删除了其中一个“重要的位”。在子依赖解析器中,您可以从ComponentModel中获取正在为其创建依赖关系的类型,并更新了答案。 – Bronumski 2012-03-21 22:39:02
@bronumskiThanks,'SubDependencyResolver'方法工作正常。 'SubDependencyResolver'中的'model.Implementation'给出了我为其创建'ILogger'实例的类的'Type'信息。但仍然想知道为什么当我在'DependsOn'上下文中使用它时,它不会给我'Type'。 – user1178376 2012-03-22 14:33:47
什么是调用类的类型? 'container.Resolve()'的类的类型? –
2012-03-21 13:30:12