2013-10-04 67 views
2

我正在使用Castle Windsor 2.5(升級目前不是選項),並且正在嘗試在原始組件註冊後註冊裝飾器。看來,在城堡版本3中,您可以使用IsDefault來實現此目的。在城堡2.5中是否有類似的操作或者其他方式來實現?在Castle Windsor 2.5中設置默認實現(對於裝飾者)

要清楚,我不能更改註冊順序,以便裝飾者首先註冊。這是一種平臺架構,其中可以通過添加或更改現有註冊來修改客戶的默認平臺行爲。

回答

1

貌似IHandlerSelector的伎倆:

public class DecoratorHandler : IHandlerSelector 
{ 
    private readonly IWindsorContainer _container; 
    private readonly HashSet<Type> _decoratedTypes = new HashSet<Type>(); 

    public DecoratorHandler(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public bool HasOpinionAbout(string key, Type service) 
    { 
     return _decoratedTypes.Contains(service); 
    } 

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) 
    { 
     return handlers[handlers.Length - 1]; 
    } 

    public void Register<TTarget, TDecorator>() where TDecorator : TTarget, IDecorator<TTarget> 
    { 
     _container.Register(Component.For<TTarget>().ImplementedBy<TDecorator>()); 
     _decoratedTypes.Add(typeof(TTarget)); 
    } 
} 

而且

_decoratorHandler = new DecoratorHandler(_container); 
_container.Kernel.AddHandlerSelector(_decoratorHandler); 
相關問題