2

私は Castle Windsor 2.5 で作業しており (アップグレードは現在オプションではありません)、元のコンポーネントが登録された後にデコレータを登録しようとしています。城のバージョン 3 では、IsDefault を使用してこれを実現できるようです。城2.5またはこれを達成するための他の方法で同様の操作はありますか?

明確にするために、デコレータが最初に登録されるように登録順序を変更することはできません。これは、顧客が既存の登録に追加または変更することで、既定のプラットフォームの動作を変更できるプラットフォーム アーキテクチャです。

4

1 に答える 1

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);
于 2013-10-05T14:29:29.953 に答える