Castle.Windsor代码审查

时间:2012-10-29 02:06:13

标签: c# .net dependency-injection inversion-of-control 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的最佳方法。我猜,有人可以建议一个更优雅的版本:)
  3. 还有其他想法吗?

    谢谢你提前。

1 个答案:

答案 0 :(得分:1)

作为一般规则,类应该只处置它拥有的资源。由于此资源是从外部提供的,因此该类不负责处理它,除非该资源的所有权被“明确”传递给它。传递所有权的这种明确性通常通过文档或使用通用设计模式来完成。例如,工厂方法(名为CreateXXX)通过返回的实例传递调用者的所有权是很自然的。另一方面,DI容器包含GetGetInstanceResolve方法,并且它们不会将所有权传递给调用者。

但除此之外,在您的情况下,您正在处理DI容器。 DI容器实例通常应该在应用程序的整个持续时间内存活。虽然容器通常需要处理,但在此类中调用dispose显然是错误的。这个工厂类不负责这样做。由于容器应在应用期间存活,因此正确的位置是在应用程序拆卸期间。例如,在ASP.NET应用程序中,这通常是global.asax中的Application_End事件。