0

我在一個工廠類中使用Castle.Windsor來創建所需類的實例。 您可以在下面找到示例。Castle.Windsor代碼審查

public class MyFactory : IDisposable 
{ 
    protected readonly IKernel Kernel; 

    protected MyFactory(IKernel kernel) 
    { 
     Contract.Requires<ArgumentNullException>(
      kernel.NotNull(), 
      "'kernel' parameter must be initialized."); 

     Kernel = kernel; 
    } 

    public IMyType Create(long param1, long param2) 
    { 
     return Kernel.Resolve<IMyType>(
      new { numberOfRows, numberOfCells }); 
    } 

    public void Dispose() 
    { 
     DisposeManagedResources(); 
    } 

    protected virtual void DisposeManagedResources() 
    { 
     Kernel.Dispose(); 
    } 
} 
  1. 我不知道,我需要的IDisposable這裏...應該怎麼處理內核MyFactory實例脫手後吧?
  2. 我不知道IKernel(在構造函數中)是解決Create方法中IMyType的最佳方法。我猜,有人可以建議更優雅的版本:)

還有其他想法嗎?

謝謝提前。

+0

嗯..我認爲ServiceLocator可以幫助我... –

+0

爲什麼你這樣做? MyFactory用在哪裏? –

回答

1

作爲一般規則,類只應該處理它擁有的資源。由於此資源是從外部提供的,因此該類不負責處理它,除非該資源的所有權是「明確」傳遞的。通過所有權的這種明確性通常是通過文檔或通過使用通用設計模式來完成的。例如,工廠方法(名稱爲CreateXXX)將調用方的所有權與返回的實例一起傳遞是很自然的。另一方面,DI容器包含Get,GetInstanceResolve方法,並且它們不會將所有權傳遞給調用方。

但除此之外,在你的情況下,你正在處理DI容器。 DI容器實例通常應該在應用程序的整個持續時間內存活。雖然容器通常需要處理,但在這個類中調用處理顯然是錯誤的地方。這個工廠班的職責不是這樣做的。由於容器應該在申請期間存活,所以正確的位置是在申請拆解期間。例如,在ASP.NET應用程序中,這通常是global.asax中的Application_End事件。

+0

非常感謝。我決定使用CommonServiceLocator.WindsorAdapter類。 'MyFactory'類不是必需的 - ServiceLocator.Current.GetInstance ()應該創建一個新的必需類的實例。只是我無法找到如何使用帶參數的構造函數......可能它會延遲初始化參數... –

+0

請勿使用Common Service Locator。您的應用程序不應直接或通過通用服務定位器界面調用容器。 [本文](http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)明確解釋了原因。 – Steven

+0

嗯......「一個可怕的開發者體驗」......但我的工廠不會對容器有直接的依賴關係......沒問題,當我的工廠類包含IKernel屬性來創建新實例時,它是不錯的練習嗎? –