1

我使用windsor城堡作爲IoC容器,並且遇到了一些問題。這是最好的代碼解釋,所以我會試一試。 我有一個工廠類,應該爲我提供了一定的接口實現:Castle Windsor:如何防止工廠創建的對象中的循環引用是創建的對象返回到工廠

public interface IObjectCreatorFactory 
{ 
    IObjectCreator GetObjectCreator(Type objectType); 
} 
public interface IObjectCreator 
{ 
    T CreateObject<T>(IDataRow data); 
    bool SupportsType(Type type); 
} 

工廠類的實現看起來是這樣的,雖然我不知道這是要走的路: 公共接口ObjectCreatorFactory:IObjectCreatorFactory {IEnumerable specificCreators; IObjectCreator defaultCreator;

public ObjectCreatorFactory(IEnumerable<IObjectCreator> specificCreators, IObjectCreator defaultCreator) 
    { 
     this.specificCreators= specificCreators; 
     this.defaultCreator= defaultCreator; 
    } 
    public IObjectCreator GetObjectCreator(Type objectType) 
    { 
     foreach (IObjectCreator creator in specificCreators) 
     { 
      if (creator.SupportsType(objectType)) 
      { 
       return creator; 
      } 
     } 
     return defaultCreator; 
    } 
} 

現在這成了個正確的,但如果我想我的IObjectCreator例如使用特定IObjectCreator創建子對象,我想打電話給ObjectCreatorFactory,這顯然會導致一個循環引用:

public void SpecificObjectCreator:IObjectCreator 
{ 
    IObjectCreatorFactory objCreatorFactory; 
    public SpecificObjectCreator(IObjectCreatorFactory objCreatorFactory) 
    { 
     this.objCreatorFactory = objCreatorFactory; 
    } 
    T CreateObject<T>(IDataRow data) 
    { 
     T obj = new T; 
     ChildObject childObject = objCreatorFactory.GetObjectCreator(typeof(ChildObject)).CreateObject<ChildObject>(data); 
     ....... 
    } 
    bool SupportsType(Type type);   
} 

這是行不通的。在這種情況下,創建的對象是否將子對象創建者引回到工廠?

回答

2

我只想移動工廠出來的各種特定對象的創造者的構造函數,並引入IObjectCreator接口的方法來代替,負責初始化的創造者:

public interface IObjectCreator 
{ 
    T CreateObject<T>(IDataRow data); 
    bool SupportsType(Type type); 
    void Initialize(IObjectCreatorFactory factory); 
} 

然後就是調用Initialze(這)每個對象創建者都進入了工廠。

在過去,我使用自定義生命週期階段來自動調用組件的「構建後」設置,以避免循環依賴關係,並照顧其他相關問題(即從其他組件配置像數據庫這樣的外部來源) - 但它可能是你需要的矯枉過正。

+0

這是一個好方法。我最終用一個定位器類替換了我的工廠類。該類然後通過使用windsorContainer.Resolve(constructorName)來定位Creators。 – 2009-02-17 10:34:56

相關問題