簡體   English   中英

Castle.Windsor代碼審查

[英]Castle.Windsor code review

我在一個工廠類中使用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的最佳方法。 我猜,有人可以建議一個更優雅的版本:)

還有其他想法嗎?

謝謝你提前。

通常,一個類僅應處置其擁有的資源。 由於此資源是從外部提供的,因此該類不負責處置它,除非對該資源的所有權“顯式”地隨其傳遞。 所有權的這種明確傳遞通常是通過文檔或使用通用設計模式來完成的。 例如,很自然的是,工廠方法(名為CreateXXX )將所有權與返回的實例一起傳遞給調用方。 另一方面,DI容器包含GetGetInstanceResolve方法,並且它們不將所有權傳遞給調用方。

但是除此之外,您需要處理的是DI容器。 DI容器實例通常應在應用程序的整個生存期內存在。 盡管容器通常需要處理,但是在此類中調用處理顯然是錯誤的位置。 這樣做不是工廠類的責任。 由於容器應在應用程序的整個生命周期內都處於生存狀態,因此正確的位置是在應用程序拆除期間。 例如,在ASP.NET應用程序中,這通常是global.asax中的Application_End事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM