1

我有一个ILog接口和2种可能的实现:控制台日志和文件日志。我在MVC应用程序中使用温莎城堡因此,我有以下的控制器安装代码:我有下面的代码Windsor Castle给定服务的多个组件

container.Register(
      Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("first").OnCreate(x => x.initialize(LogType.Console, null)).LifestyleSingleton(), 
      Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("second").OnCreate(x => x.initialize(LogType.File, null)).LifestyleSingleton(), 
      Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("first").GetLog(LogType.Console)).Named("first_log").LifestyleSingleton(), 
      Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("second").GetLog(LogType.File)).Named("second_log").LifestyleSingleton() 
     ); 

在我的TestController:

private ILog log; 

public TestController(ILog _log) 
{ 
    log = _log; 
} 

我想知道我怎么能决定注入名为first_log或second_log的ILog

+0

单元测试通常具有被测定物1类和0到许多假类(嘲笑或存根)。您不测试DI配置 - 这是您的应用程序的一部分 - 通常您不使用DI容器进行单元测试。所以,假设'TestController'是一个模拟,在这种情况下测试的类是什么?如果您正在测试特定的记录器或特定的日志工厂,则应该使用'new'关键字在测试中创建它的一个实例。 – NightOwl888

+0

这不是一个单元测试:我刚刚命名为控制器TestController,但可以将其称为myController或任何您想要的。我只是想知道如何在这个控制器,我可以处理我想要注入的日志,基于它的名字 –

+0

当谈到日志记录,通常有一个日志记录组件('ILog')和配置用于在运行时确定它应该记录的地方 - 文件,控制台,数据库等 - 以及在什么级别 - 调试,警告,错误等。这允许更改日志配置而无需重新编译代码。 Log4net就是一个很好的例子。 –

回答

0

我找到了我的方案的解决方案。所述的TestController需要2个ILogs定义:

public class TestController : Controller 
{ 
private ILog log1; 
private ILog log2; 

public TestController(ILog _log1, ILog _log2) 
{ 
log1 = _log1; 
log2 = _log2; 
identifier = _identifier; 
} 

然后,它需要添加:

container.Register(
Component.For<MyController>().DependsOn(
ServiceOverride.ForKey("_log1").Eq("first_log"), 
ServiceOverride.ForKey("_log2").Eq("second_log")).LifestyleTransient() 
); 

替换实际的默认内容:

container.Register(
Classes. 
FromThisAssembly(). 
BasedOn<IController>(). 
If(c => c.Name.EndsWith("Controller")). 
LifestyleTransient()); 
0

对不起,迟到的回应。

您可以使用子依赖关系解析器。它允许您解析另一个组件的依赖关系的特定组件。下面的代码应该(未经测试)根据TestController的构造函数中参数的名称来解析ILog。因此,TestController(ILog第一个)将解析名为first的ILog。

class SubDepResolver : ISubDependencyResolver 
{ 
    private IKernel kernel; 
    SubDepResolver(IKernel kernel) 
    { 
    this.kernel = kernel; 
    } 

    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, 
    DependencyModel dependency) 
    { 
    if (model.GetComponentType() != typeof(TestController)) return false; 
    if (dependency.GetComponentType() != typeof(ILog)) return false; 
    return true; 
    } 

    public object Resolve(
    CreationContext context, 
    ISubDependencyResolver contextHandlerResolver, 
    ComponentModel model, 
    DependencyModel dependency) 
    { 
    var handlers = kernel.GetHandlers(typeof(ILog)); 
    var handler = handlers.Single(h => h.GetComponentName() == dependency.DependencyKey); 
    return handler.Resolve(context); 
    } 
} 

添加使用的解析器:

container.Kernel.Resolver.AddSubResolver(new SubDepResolver(container.Kernel)); 

祝你好运, Marwijn。

相关问题