注册默认的Castle Windsor组件,同时允许自定义组件

时间:2015-03-17 00:36:47

标签: c# dependency-injection castle-windsor

我正在尝试使用Castle Windsor实现基于约定的注册,但我无法弄清楚如何处理交换服务的默认实现。

在我的框架中,我可能有一个服务接口和一个默认实现:

public interface ILogger
{
     void Info(string message);
}

public class Logger : ILogger
{
     public void Info(string message)
     {
         Console.WriteLine(message);
     }
}

在典型的用例中,我希望Castle Windsor使用ILogger服务注册Logger。

但是,在某些用例中,客户端代码可能提供ILogger的替代实现:

public class CustomLogger : ILogger
{
    public void Info(string message)
    {
         Console.WriteLine("[LOG]: {0}", message);
    }
}

在这个用例中,我希望Castle Windsor使用ILogger服务而不是Logger注册CustomLogger。

到目前为止,我尝试过像分层方法,我尝试注册所有默认接口,然后是非默认接口:

using (var container = new WindsorContainer())
{
    container.Register(
        Classes.FromAssemblyInDirectory(new AssemblyFilter(pluginDirectoryPath))
            .Where(type => true)
            .WithService.DefaultInterfaces(), 
        Classes.FromAssemblyInDirectory(new AssemblyFilter(pluginDirectoryPath))
            .Where(type => true)
            .WithService.AllInterfaces());

    var logger = container.Resolve<ILogger>();
    logger.Info("hello, world!");
}

然而,这似乎不起作用,因为Logger和CustomLogger都注册到ILogger,但是当我解决ILogger时我仍然回到Logger。有关如何执行此操作的任何提示吗?

此外,我无法单独注册每个组件和服务,因为组合根是与客户端代码分开的自己的可执行文件,因此,如果不进行某些程序集扫描,它对可用的服务知之甚少。

1 个答案:

答案 0 :(得分:1)

首先注册获胜,所以...首先注册您的非默认实现,然后注册您的默认实现以填补空白。