2011-07-14 94 views
0

我有一個裝飾和實際執行,看起來像這樣:如何使用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>() 
     ); 
    } 
} 

不過,我還是要告訴它兩件事情。

  1. 當它解決IAmUsedTwice我希望它從現在開始,而不是其他類
  2. 在解決DecoratingIsFun我需要它來解決解決DecoratingIsFun的實例ForReal爲它創建實例的構造函數的參數。

目標是我可以然後調用windsorContainer.Resolve()並獲得一個DecoratingIsFun實例。

我該如何告訴安裝程序來做到這一點?

回答

2

爲了讓DecoratingIsFun裝飾ForReal,你需要確保DecoratingIsFun註冊ForReal - 然後將溫莎正確解析裝飾,滿足用的東西,實現IAmUsedTwice下一個註冊的依賴。

但是,由於您使用的是XML來註冊第一個服務,所以我不知道如何實現這一點,因爲當您實例化WindsorContainer時,XML被吸收了。

但是,您爲什麼首先使用XML?是否因爲你不認爲你可以使用XML來配置組件組件,除非你也用它來寄存器它們?

如果是這樣的話,你應該在XML減少這樣的事情:

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

和移動登記你的代碼,使您可以控制登記的先後順序。然後,確保ForReal已註冊.Named("forReal"),允許在解析實例時匹配配置。

+0

感謝您的信息。我使用XML的原因是因爲XML實際上來自遺留代碼,所以它一直是我的「起點」。不過,我想開始將東西移植到Fluent API中,因此其中一部分是XML,另一部分是Fluent API。 – Joseph

相關問題