Как настроить декоратор с помощью Castle Windsor? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть декоратор и фактическая реализация, которая выглядит следующим образом:

public interface IAmUsedTwice
{
    void DoSomething();
}

public class ForReal: IAmUsedTwice
{
    public SomethingElse Need { get; set; }

    public ForReal(SomethingElse iNeed)
    {
        Need = iNeed;
    }

    public void DoSomething()
    {
        Console.WriteLine("Realing doing something here");
    }
}

public class SomethingElse {}

public class DecoratingIsFun: IAmUsedTwice
{
    private IAmUsedTwice Actual { get; set; }

    public DecoratingIsFun(IAmUsedTwice actual)
    {
        Actual = actual;
    }

    public void DoSomething()
    {
        Console.WriteLine("This is a decorator!");
        Actual.DoSomething();
    }
}

, и конфигурация была настроена до того, как я начал это, используя xml для фактической реализации, и выглядит примерно так:

<component id="forReal"
           service="SomeNamespace.IAmUsedTwice, SomeNamespace"
           type="SomeNamespace.ForReal, SomeNamespace">
  <parameters>
    <iNeed>${iNeed}</iNeed>        
  </parameters>
</component>

и вы можете предположить, что компонент iNeed уже настроен правильно.

Теперь система уже настроена на использование класса ForReal, но я хочу поменять класс ForReal.и теперь используйте класс DecoratingIsFun.

Я создал установщик для регистрации класса DecoratingIsFun следующим образом:

public class DecoratorInstaller: IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<IAmUsedTwice>()
                .ImplementedBy<DecoratingIsFun>()
        );
    }
}

Однако мне все еще нужно сказать ему две вещи.

  1. Когда он разрешает IAmUsedTwice, я хочу, чтобы он теперь разрешал экземпляр DecoratingIsFun вместо другого класса
  2. При разрешении DecoratingIsFun он мне нужен, чтобы разрешить ForReal в качестве аргумента конструктора для создаваемого экземпляра.

Цель состоит в том, чтобы я мог затем вызвать windsorContainer.Resolve () и получить DecoratingIsFun instance.

Как я могу сказать установщику сделать это?

1 Ответ

2 голосов
/ 15 июля 2011

Чтобы разрешить DecoratingIsFun для украшения ForReal, необходимо убедиться, что DecoratingIsFun зарегистрировано до ForReal - тогда Виндзор правильно разрешит декоратор и удовлетворит его зависимость отследующая регистрация чего-то, что реализует IAmUsedTwice.

Но так как вы используете XML для регистрации первой службы, я не знаю, как этого добиться, так как XML засасывается, когда вы создаете экземпляр WindsorContainer.

Но почему вы вообще используете XML?Это потому, что вы не думаете, что вы можете использовать XML для конфигурирования компонентов, если только вы не используете его для регистрации их?

Если это так, вы должны уменьшить XML до чего-то вроде этого:

<component id="forReal">
    <parameters>
        <iNeed>${iNeed}</iNeed>        
    </parameters>
</component>

и перенести регистрацию в свой код, что позволит вам контролировать порядок регистрации.Затем убедитесь, что ForReal зарегистрировано с .Named("forReal"), что позволяет сопоставить конфигурацию при разрешении экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...