如何使IDisposable对象成为一个类变量?

时间:2010-03-14 00:44:01

标签: c# active-directory idisposable class-variables

我正在使用C#使用Active Directory。实例化PrincipalContext对象似乎很昂贵,所以我想在类变量中存储一个。

使用PrincipalContext作为局部变量时,我可以使用方便的using语法。在静态变量中存储IDisposable对象时,如何确保对象被正确处理?

3 个答案:

答案 0 :(得分:7)

这样做的一般模式是在您的类上实现IDisposable接口。举个例子:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

    public YourClass()
    {
        yourResource = new OtherDisposableType();
    }

    public void Dispose()
    {
        yourResource.Dispose();
    }
}

这至少是您需要做的事情。

修改

我之前的版本主张在所有情况下遵循终结器模式,这是(正确地)指出是违反框架设计指南的。但是,如果您实际处理非托管资源(例如,您正在进行直接P / Invoke调用并获取需要显式释放的句柄),建议您创建终结器并调用{{1在其中,以防止使用您的代码并且不调用Dispose的人:

Dispose

答案 1 :(得分:2)

查看System.ComponentModel命名空间的作用。基本上,我通常使用的模式是拥有一个子组件集合,其中包括我拥有的不是“值”的所有内容 - 无论它是否实现IDisposable

然后,当我自己Dispose()时,我会迭代此集合并Dispose实现IDisposable的所有内容。

这种技术的一个优点是,如果我拥有的对象开始不是Disposable,但后来添加了IDisposable接口,我的类将做正确的事情,而不必更改。

此外,使用DI / IoC容器可以为您处理大部分内容。

答案 2 :(得分:1)

所以基本上你想要缓存昂贵的资源。这是件好事。

全球数据(在这种情况下是静态变量)并不是一件好事,恕我直言。相反,为什么不把它变成实例变量并控制生命周期呢?

编写处理AD职责的类,让它创建并使用PrincipalContext,并使其成为IDisposable(使用Dispose Pattern)。从中提取一个接口以将其解耦并使使用它的类更容易测试。

要使用AD服务的类将采用新接口(Dependency Injection或DI)的构造函数参数。您可以在using块中手动创建类,并将其传递给类或使用DI Container Framework。您可以让框架将AD对象的生命周期设置为容器的生命周期(也可以是IDisposable)。有关详细信息,请参阅How do you reconcile IDisposable and IoC?和您的DI Container文档。