Castle Windsor服务覆盖默认值

本文关键字:默认值 覆盖 服务 Windsor Castle | 更新日期: 2023-09-27 18:01:36

我想知道温莎是否有以下场景的模式。

基本上我有一个注册的服务(DefaultService),并有一个插件,我想用(PluginBasedService)替换所有实例的服务(DefaultService)。

我目前正在使用hack - Kernel.RemoveComponent(),然后重新添加我的基于插件的服务。这看起来很老套。对于这个场景,IHandleSelector似乎也很粗糙。

Autofac解决"Last Registered"服务的方法也适用于我。

欢呼,克里斯。

public class VM 
{
  public VM(IService)  
  {
  }
}
public interface IService {}
public class DefaultService : IService {} 
public class PluginBasedService : IService {}
Container.Register(
  Component.For<IService>().ImplementedBy<DefaultService>(), 
  Component.For<VM>()
  );
  // this is called in a dynamically loaded assembly, after the default service has been registered
Container.Register(
  Component.For<PluginBasedService>()
  .ServiceOverrides(ServiceOverride.ForKey<IService>.Eq<PluginBasedService>())
  );

Container.Resolve<IService>() // is DefaultService -> I want "PluginBasedService"

Castle Windsor服务覆盖默认值

我不确定我理解这个问题(也许你可以重写它,它不是很清楚你所追求的),但如果我理解正确,你所追求的是能够在特定上下文中为给定的服务使用不同的组件。

如果确实是这样的话,我认为IHandlerSelector或子容器可能提供一种实现这一目标的方法。