Добавление нотации к зависимости компонента в Виндзорском замке

У меня есть 2 компонента (AWriter и BWriter), оба из которых реализуют интерфейс IWriter. И у меня есть 2 компонента (AComponent и BComponent), где оба реализуют интерфейс IComponent и оба зависят от IWriter. Но в AComponent я хочу сказать Windsor, чтобы он дал мне экземпляр AWriter, а в BComponent я хочу сказать Windsor, чтобы он дал мне экземпляр BWriter. Как это сделать?

Вот код:

public interface IWriter
    {
        void Write();
    }

    public class AWriter : IWriter
    {
        public void Write()
        {
            Console.Write("A writer");
        }
    }

    public class BWriter : IWriter
    {
        public void Write()
        {
            Console.Write("B writer");
        }
    }

    public interface IComponent
    {
        void Do();
    }

    public class AComponent : IComponent
    {
        IWriter writer;

        public AComponent(IWriter writer)
        {
            this.writer = writer;
        }

        public void Do()
        {
            writer.Write();
        }
    }

    public class BComponent : IComponent
    {
        IWriter writer;

        public BComponent(IWriter writer)
        {
            this.writer = writer;
        }

        public void Do()
        {
            writer.Write();
        }
    }

ПРИМЕЧАНИЕ. Это просто упрощенная проблема, и размещение AWriter в AComponent и BWriter в BComponent в качестве зависимости не является вариантом. Также в этом примере AComponent и BComponent могут выглядеть одинаково, но это не реальная ситуация. У меня гораздо больше зависимостей и компонентов в реальной ситуации, и я не хотел с этим заморачиваться.

Итак, есть ли способ каким-то образом указать каким-то атрибутом, какую реализацию должен дать мне Касл?


person Vajda    schedule 01.09.2011    source источник
comment
возможный дубликат проблемы касты Виндзор   -  person Mark Seemann    schedule 01.09.2011


Ответы (1)


Вы хотите использовать именованные компоненты и переопределения служб. Для получения справки см. документацию Windsor: http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx

Используя беглую регистрацию, вы бы сделали что-то вроде:

container.Register(Component.For<IComponent>()
                            .ImplementedBy<AWriter>().Named("AWriter"),
                   Component.For<IComponent>()
                            .ImplementedBy<BWriter>().Named("BWriter"));

Потом:

container.Register(Component.For<IComponent>()
                            .ImplementedBy<AComponent>()
                            .ServiceOverrides(
                                ServiceOverride.ForKey("writer").Eq("AWriter"));
container.Register(Component.For<IComponent>()
                            .ImplementedBy<BComponent>()
                            .ServiceOverrides(
                                ServiceOverride.ForKey("writer").Eq("BWriter"));

Конечно, это приведет к двум регистрациям для IComponent, но опять же, если вам нужно внедрить определенные экземпляры, вы можете назвать их и использовать переопределения службы для внедрения каждой реализации в соответствующее место в вашей структуре зависимостей.

person Paul Kirby    schedule 12.09.2011