2011-07-08 8 views
0

私はウィンザーに次のようなシナリオのパターンがあるのだろうかと思っていました。城ウィンザーサービスオーバーライドデフォルトのオーバーライド

基本的に私は登録されているサービス(DefaultService)を持っており、すべてのインスタンスに対してサービス(DefaultService)を(PluginBasedService)に置き換えるプラグインを持っています。

私は現在、ハッキング-Kernel.RemoveComponent()を使用していて、プラグインベースのサービスを再追加しています。これはハッキーなようだ。 IHandleSelectorもこのシナリオではハッキーです。

「最後に登録した」サービスを解決するAutofacのアプローチも私にとっては役に立ちます。

乾杯、 クリス

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" 

答えて

1

私は(多分あなたはそれを書き換えることができ、それはあなたが後にしているものを非常に明確ではありません)質問を理解してわからないんだけど、私が正しく理解していれば、何特定の状況において、特定のサービスに対して異なるコンポーネントを使用できるようにすることです。

本当にそうだとしたら、IHandlerSelectorか子コンテナのいずれかがその目的を達成する方法を提供していると思います。

+0

少し整理しました。私は子供の容器を見て、彼らが私の問題を解決するかどうかを見ます。ありがとう – Chris

+0

BTW、Windsor(v3)の次期バージョンでは、サービスを登録するときにコンポーネントを強制的にデフォルトにすることができます。 –

関連する問題