我正在尝试使用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。有关如何执行此操作的任何提示吗?
此外,我无法单独注册每个组件和服务,因为组合根是与客户端代码分开的自己的可执行文件,因此,如果不进行某些程序集扫描,它对可用的服务知之甚少。
答案 0 :(得分:1)
首先注册获胜,所以...首先注册您的非默认实现,然后注册您的默认实现以填补空白。