У меня есть декоратор и фактическая реализация, которая выглядит следующим образом:
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>()
);
}
}
Однако мне все еще нужно сказать ему две вещи.
- Когда он разрешает IAmUsedTwice, я хочу, чтобы он теперь разрешал экземпляр DecoratingIsFun вместо другого класса
- При разрешении DecoratingIsFun он мне нужен, чтобы разрешить ForReal в качестве аргумента конструктора для создаваемого экземпляра.
Цель состоит в том, чтобы я мог затем вызвать windsorContainer.Resolve () и получить DecoratingIsFun instance.
Как я могу сказать установщику сделать это?