我有一個裝飾和實際執行,看起來像這樣:如何使用Castle Windsor配置裝飾器?
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實例。
我該如何告訴安裝程序來做到這一點?
感謝您的信息。我使用XML的原因是因爲XML實際上來自遺留代碼,所以它一直是我的「起點」。不過,我想開始將東西移植到Fluent API中,因此其中一部分是XML,另一部分是Fluent API。 – Joseph