Добавление обозначений к зависимостям компонентов в Виндзорском замке - PullRequest
3 голосов
/ 01 сентября 2011

У меня есть 2 компонента (AWriter и BWriter), где оба реализуют интерфейс IWriter. И у меня есть 2 компонента (AComponent и BComponent), где оба реализуют интерфейс IComponent и оба имеют зависимость от IWriter. Но в AComponent я хочу сказать Виндзору, чтобы он дал мне экземпляр AWriter, а в BComponent я хочу, чтобы Виндзор дал мне экземпляр 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 могут выглядеть одинаково в этом примере, но это не настоящая ситуация. У меня намного больше зависимостей и компонентов в реальной ситуации, и я не хотел беспокоиться об этом.

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

1 Ответ

1 голос
/ 12 сентября 2011

Вы хотите использовать именованные компоненты и переопределения служб.Для получения справки см. Документацию 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, но, опять же, если вам нужно внедрить конкретные экземпляры, вы можете назвать их и использовать переопределения служб для внедрения каждой реализации в соответствующее место в вашей структуре зависимостей.

...