2012-03-21 136 views
1

我有一个类需要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

+0

什么是调用类的类型? 'container.Resolve ()'的类的类型? – 2012-03-21 13:30:12

回答

1

更新

通过您的更新去要注入的类型,这样就可以用它来记录。有两种解决方案。

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。

+0

@ user1178376我已经发现我们出错的地方我错过了关于被称为NLogLogger的类并从ILogger继承的全部内容,我归类到这个类,并且认为这是一个依赖于注入类型的类它自己的记录器。基本上你想要做的是创建一个SubDependencyResolver,这是我给你的,但现在我已经重读了这一切都是有道理的问题。 – Bronumski 2012-03-21 21:53:08

+0

@ user1178376对不起,它迟到了,我犯了愚蠢的错误。当我从我们的具体实现中删除逻辑时,我删除了其中一个“重要的位”。在子依赖解析器中,您可以从ComponentModel中获取正在为其创建依赖关系的类型,并更新了答案。 – Bronumski 2012-03-21 22:39:02

+0

@bronumskiThanks,'SubDependencyResolver'方法工作正常。 'SubDependencyResolver'中的'model.Implementation'给出了我为其创建'ILogger'实例的类的'Type'信息。但仍然想知道为什么当我在'DependsOn'上下文中使用它时,它不会给我'Type'。 – user1178376 2012-03-22 14:33:47

相关问题