c# - 工厂应该跟踪创建的 IDisposable 对象吗?

标签 c# dispose idisposable factory-pattern

考虑以下简单的工厂示例:

public class MyFactory : IMyFactory
{
    public MyObject CreateObject()
    {
        return new MyObject();
    }
}

在这个例子中,MyObject 实现了IDisposable 接口(interface)。通常我希望消费程序按如下方式使用它:

// Use using to properly dispose of MyObject
using (MyObject obj = myFactory.CreateObject())
{
    // ...
}

期望使用工厂的开发人员处理这样的处置是常见的做法吗?或者 Factory 是否应该保留它创建的对象的列表并确保定期清理它们,或者可能在处理工厂时清理它们?

最佳答案

实现 IDisposable 的类型为该类型的使用者提供了一种确定性地清理该类型使用的任何非托管 资源的方法。例如,当 FileStream 被释放时,底层操作系统文件句柄被关闭。

任何直接使用非托管资源(例如文件句柄、数据库连接、 native 套接字等)的正确实现的类型也将有一个终结器来在对象被垃圾回收时释放非托管资源。由类型的使用者决定是使用 IDisposable 确定性地释放非托管资源,还是只是等待垃圾收集器执行此操作。在大多数情况下,您想走确定性路线。例如,您不希望在其他进程可以访问文件之前等待垃圾收集器。您希望在处理完该文件后立即关闭该文件。

所以垃圾收集器结合终结器将执行您尝试委托(delegate)给工厂的任务,并且由于您的工厂不是垃圾收集器,您可能很难真正实现这种“跟踪和自动清理” ".

所以我对你的问题的主要回答是,不,工厂不应该跟踪创建的 IDisposable 对象。

但是,如果您的工厂是某种控制所创建对象生命周期的容器,您可以将工厂本身设置为IDisposable,然后处置所有已创建对象。这是依赖注入(inject)容器中的一种常见模式,用于像 Web 应用程序中的响应-请求周期。容器在请求开始时创建,并在响应完成时释放。工厂创建的类型的消费者没有注意到在请求结束时必须处理某些类型这一事实。

关于c# - 工厂应该跟踪创建的 IDisposable 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540301/

相关文章:

c# - ID一次性示例

.net - CommonDialog 组件应该如何处理?

c# - 在 C++ 和 C# 之间进行通信的最快方式

c# - 为什么我的 ScrollViewer 会破坏我的网格布局? WPF

C# 自定义关闭、最小化和最大化按钮

c# - 压缩URL中的参数

c# - 在具有终结器的类上调用 .Dispose()

c# - 在操作方法中抛出 HttpResponseException 时处理 HttpResponseMessage 及其内容

memory-management - 我是否通过显式处理 imageView.Image 来赢得内存?

c# - DI 与一次性元素