Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: VajdaОтветов: 1

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

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

  • возможный дубликат проблемы касты Виндзор Mark Seemann 01.09.2011

dependency-injectioncastle-windsorioc-container

Ответы

Ответ 1 · рейтинг 1 · Paul Kirby

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы