C# 注册默认城堡温莎组件,同时允许自定义组件

C# 注册默认城堡温莎组件,同时允许自定义组件,c#,dependency-injection,castle-windsor,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(messag

我正在尝试使用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服务注册CustomLogger,而不是Logger

到目前为止,我已经尝试了类似于分层方法的方法,其中我尝试注册所有默认接口,然后是非默认接口:

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!");
}
使用(var container=new WindsorContainer())
{
集装箱。登记(
Classes.FromAssemblyInDirectory(新的AssemblyFilter(pluginDirectoryPath))
.Where(type=>true)
.WithService.DefaultInterfaces(),
Classes.FromAssemblyInDirectory(新的AssemblyFilter(pluginDirectoryPath))
.Where(type=>true)
.WithService.AllInterfaces());
var logger=container.Resolve();
logger.Info(“你好,世界!”);
}
然而,这似乎不起作用,因为Logger和CustomLogger都已注册到ILogger,但在解析ILogger时,我仍然会返回Logger。有什么建议吗


此外,我无法单独注册每个组件和服务,因为组合根目录是其自身的可执行文件,与客户端代码分离,因此,在不进行程序集扫描的情况下,它对哪些服务可用的知识非常有限。

首次注册的wins,因此。。。只需先注册非默认实现,然后注册默认实现以填补空白。

我不知道如何使用“自动扫描”方法,但对于单个注册,这需要1)在默认组件上设置
IsFallback
;或2)设置唯一的组件名称,并使用
IsDefault
进行覆盖。看啊,是的,我刚才看到了关于IsFallback的答案,但是我不知道如何对类做同样的事情。FromAssemblyIndirector在没有IsFallback和IsDefault的情况下,first registered将获胜。难道你不能先注册你的非默认实现,然后再注册你的默认实现来填补空白吗?啊哈!我想这就是我做错的地方。我以为我在什么地方读到过最后一次注册获胜的消息。我修改了Where子句,根据我的命名约定查找非默认实现,然后是默认实现,这就成功了。