0

我在一个工厂类中使用 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 的最佳方法。我想,有人可以建议一个更优雅的版本:)

还有其他想法吗?

谢谢你提前。

4

1 回答 1

1

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

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

于 2012-10-29T10:06:27.083 回答