注册默认的 Castle Windsor 组件,同时允许自定义组件
Register default Castle Windsor components while allowing custom components
我正在尝试使用 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 将 CustomLogger 注册到 ILogger 服务而不是 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!");
}
但是,这似乎不起作用,因为 Logger 和 CustomLogger 都已注册到 ILogger,但是当我解析 ILogger 时我仍然返回 Logger。有关如何执行此操作的任何提示?
此外,我无法单独注册每个组件和服务,因为组合根是独立于客户端代码的独立可执行文件,因此如果不进行一些程序集扫描,它对哪些服务可用的了解非常有限。
先注册者获胜,所以...只需先注册您的非默认实现,然后再注册您的默认实现以填补空白。
我正在尝试使用 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 将 CustomLogger 注册到 ILogger 服务而不是 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!");
}
但是,这似乎不起作用,因为 Logger 和 CustomLogger 都已注册到 ILogger,但是当我解析 ILogger 时我仍然返回 Logger。有关如何执行此操作的任何提示?
此外,我无法单独注册每个组件和服务,因为组合根是独立于客户端代码的独立可执行文件,因此如果不进行一些程序集扫描,它对哪些服务可用的了解非常有限。
先注册者获胜,所以...只需先注册您的非默认实现,然后再注册您的默认实现以填补空白。