繁体   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